是否可以使用属性指定COM枚举字段名称?

时间:2011-07-15 05:41:34

标签: c# attributes enums com-interop

我正在使用.net程序集替换(部分)Delphi COM库。我已将许多COM接口和枚举移动到.net程序集。除了使用{enum_type_name} _ {enum_value_name}命名约定将枚举导出到类型库之外,一切都很好。

实施例

[ComVisible(true)]
[Guid("318f9e87-444c-11d5-aed1-00105a758da4")]
public enum KeyIDEnum
{
    keLeft = 0,
    keCentre = 1,
    keRight = 2
}

变为

[
  uuid(318F9E87-444C-11D5-AED1-00105A758DA4),
  version(1.0)
]
typedef enum tagKeyIDEnum
{
  KeyIDEnum_keLeft = 0,
  KeyIDEnum_keCentre = 1,
  KeyIDEnum_keRight = 2
} KeyIDEnum;

我想知道是否有任何方法可以覆盖此默认行为并指定枚举值名称,可能使用属性。类似的东西:

[ComVisible(true)]
[Guid("318f9e87-444c-11d5-aed1-00105a758da4")]
public enum KeyIDEnum
{
    [Name("keLeft")]
    keLeft = 0,
    [Name("keCentre")]
    keCentre = 1,
    [Name("keRight")]
    keRight = 2
}

我几乎可以肯定有一种方法可以做到这一点我只需要知道要使用哪个属性类。

1 个答案:

答案 0 :(得分:2)

简而言之,我相信它可以做到,但这并不容易。我几乎可以肯定,某个属性不会像导出type conversion talks上的MSDN页面那样关于前缀,但是没有提到相关属性(而页面的其他部分也是如此)。 System.Runtime.InteropServices中的类列表(其中与COM相关的属性存在)也没有任何看似有希望的属性。

最后,Mauricio Rojas的blog post描述了如何通过修改IDL来实现它,但它看起来很难看。 (其他一些博客也有类似的描述。)