Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么需要在c#中使用DispId注释?_C#_.net_Visual Studio_Com - Fatal编程技术网

为什么需要在c#中使用DispId注释?

为什么需要在c#中使用DispId注释?,c#,.net,visual-studio,com,C#,.net,Visual Studio,Com,比如说 public interface IWMPSettings [DispId(101)] bool autoStart { get; set; } [DispId(102)] int balance { get; set; } 它是有用的还是只是为编译器自动生成的?COM分派标识符是什么?在.NET上下文中何时需要它们?简而言之,是的,它很有用,但仅适用于COM分派: (摘自MSDN): 指定方法、字段或属性的COM分派标

比如说

public interface IWMPSettings

        [DispId(101)]
        bool autoStart { get; set; }
        [DispId(102)]
        int balance { get; set; }

它是有用的还是只是为编译器自动生成的?COM分派标识符是什么?在.NET上下文中何时需要它们?

简而言之,是的,它很有用,但仅适用于COM分派:

(摘自MSDN):

指定方法、字段或属性的COM分派标识符(DISPID)

此属性包含它所描述的方法、字段或属性的DISPID。唯一DISPID通常由公共语言运行库分配,但您可以使用此属性将特定DISPID分配给方法。导入类型库时,此属性将应用于具有指定DISPID的所有方法。这可确保同一方法的任何托管实现在向COM公开时保留相同的DISPID


我不明白。我不是c#程序员。这对作为开发人员的me意味着什么?@IAdapter如果您的类型是COM可见的,并且您希望通过COM代码(而不是.Net)调用它们,那么您可能需要使用此属性。但是,它不会影响从.Net调用这些方法的任何代码,因此,如果您的代码都是.Net,则该属性是冗余的。遵循上面的一些方法是否正确:基本上,如果您要在同一程序集中、同一类中,只对每个方法、属性和字段执行一次,等等。,这是不必要的,即使在VB6中使用COM或其他任何东西来访问它。但是,如果您要使用一个方法、字段或属性,并在不同的DLL中实现它,或者执行类似的操作(可能手动支持不同的平台,可能将旧代码移植到新的语言,等等),那么这就非常方便了,因为它将保持相同的身份。这是正确的上下文和上面引用的所有内容吗?@Panzercrisis我同意你的评论,我也不认为这真的回答了问题的意图(虽然它在严格意义上是这样做的…当这些dispid有用时它无法传达)足够公平,但也许更相关的是询问COM调度标识符是什么,因为MSDN告诉您这就是
DispId
的用途!这意味着你做错了。项目+添加引用,浏览选项卡,选择c:\windows\system32\wmp.dll。您现在已经定义了WMPLib.IWMPSettings类型。@WillVousden讽刺的是,这个页面在搜索结果中是#1。@lorddev这让我很高兴!DispID有用的示例: