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

17
例如。
public interface IWMPSettings

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

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


1
很好,但也许更相关的问题是询问什么是COM分发标识符,因为MSDN告诉你这就是“DispId”的作用! - Will Vousden
1
这意味着你做错了。项目 + 添加引用,浏览选项卡,选择 c:\windows\system32\wmp.dll。现在你已经定义了 WMPLib.IWMPSettings 类型。 - Hans Passant
4
具有讽刺意味的是,这个页面在搜索结果中排名第一。 - devlord
@lorddev 这让我感到很有趣! - Will Vousden
DispID有用的示例:https://dev59.com/NlPTa4cB1Zd3GeqPlrfE#4796838 - StayOnTarget
1个回答

15
简而言之,是的,它很有用,但仅适用于COM调度: DispIdAttribute(来自MSDN):
指定方法、字段或属性的COM调度标识符(DISPID)。
此属性包含所描述方法、字段或属性的DISPID。通常由公共语言运行时分配唯一的DISPID,但您可以使用此属性为方法分配特定的DISPID。在导入类型库时,此属性应用于所有已分配DISPID的方法。这确保了任何公开给COM的同一方法的托管实现保持相同的DISPID。

我不明白。我不是C#程序员。这对我作为开发者意味着什么? - IAdapter
4
如果你的类型在COM中可见,并且你期望它们通过COM代码被调用(而不是.NET),那么你可能需要使用这个属性。但是它不会影响任何从.NET调用这些方法的代码,所以如果你的代码都是.NET的话,这个属性就是多余的。 - Rich O'Kelly
2
这是遵循上述一些内容的正确方式吗:基本上,如果您要将每个方法、属性和字段仅实现一次,在同一程序集、同一类等中,即使在使用COM在VB6或其他任何东西中访问它时,这是不必要的。但是,如果您要在不同的dll中实现一个方法、字段或属性,或者做其他类似的事情(也许手动支持不同的平台,也许将旧代码移植到新语言等),那么这就非常方便了,因为它将保持相同的标识。 - Panzercrisis
上面的引用是否正确?上下文是否恰当? - Panzercrisis
3
我同意你的评论,我认为这并没有真正回答问题的意图(虽然在严格意义上是这样...但它没有传达这些DispID何时有用)。 - StayOnTarget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接