【问题标题】:Why would you need to use the DispId annotation in c#?为什么需要在 c# 中使用 DispId 注释?
【发布时间】:2012-02-12 03:19:45
【问题描述】:

例如

public interface IWMPSettings

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

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

【问题讨论】:

  • 很公平,但也许更相关的是询问 COM 调度标识符是什么,因为 MSDN 告诉您这就是 DispId 的用途!
  • 这意味着你做错了。项目 + 添加引用,浏览选项卡,选择 c:\windows\system32\wmp.dll。您现在已经定义了 WMPLib.IWMPSettings 类型。
  • @WillVousden 讽刺的是,这个页面在搜索结果中排名第一。
  • @lorddev 这让我发痒!
  • DispID 有用的示例:stackoverflow.com/a/4796838/3195477

标签: c# .net visual-studio com


【解决方案1】:

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

The DispIdAttribute(来自 MSDN):

指定方法、字段或属性的 COM 调度标识符 (DISPID)。

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

【讨论】:

  • 我不明白。我不是 c# 程序员。作为开发人员,这对我意味着什么?
  • @IAdapter 如果您的类型是 COM 可见的,并且您希望它们通过 COM 代码(而不是 .Net)调用,那么您可能需要使用此属性。但是,它不会影响从 .Net 调用这些方法的任何代码,因此如果您的代码都是 .Net,则该属性是多余的。
  • 这是遵循上述某些内容的正确方法吗:基本上,如果您打算采用每个方法、属性和字段并在同一个程序集中只实现一次,在相同的类等,这是不必要的,甚至在 VB6 中使用 COM 或其他任何方式来访问它时。但是,如果您要采用方法、字段或属性并在不同的 dll 中实现它或执行其他类似操作(可能手动支持不同的平台,可能将旧代码移植到更新的语言等),then 那是它真正派上用场的时候,因为它将保持相同的身份。
  • 这是正确的上下文和上面引用的所有内容吗?
  • @Panzercrisis 我同意你的 cmets,我认为这也不能真正回答问题的意图(认为它在严格意义上是这样做的......当这些 DispID 时它没有传达很有用)
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 2013-08-22
相关资源
最近更新 更多