如何在 COM 可见组件中写入 VB.NET 中的枚举

How to write Enums in VB.NET in a COM visible component

我目前正在写一个COM可见组件(实际上是进程外exe)。

我的问题是如何正确地进行枚举。

我的界面中只有这个

<ComVisible(True)> _
Enum TestTypes
    TestType1 = 1
    TestType2 = 2
    TestType3 = 3
End Enum

我看到的是在对象浏览器中每个项目都是 TestTypes_TestType1 等

您所看到的是完全正常的:.NET 的类型库生成器总是在枚举字段前加上它们各自的枚举名称作为前缀。如果您想覆盖此行为,您需要手动编辑 IDL 文件中的字段并重新创建类型库。有关详细信息,请参阅 this link。

这是枚举的一个老问题,至少可以追溯到 C 语言。一种将枚举成员添加到全局名称空间的语言。大家应该不陌生,VBA也是这样做的。这是一个非常丑陋的问题,在大型程序中的扩展性非常差。像 FileShare.Read 这样的 .NET 枚举值不能只导出为 Read。几乎肯定会导致标识符名称或关键字冲突。

程序员使用两个基本技巧来避免此类冲突。 C 中常见的是 upper-case 枚举成员。当然,在 VB 这样的语言中效果不佳。另一个技巧是前缀一个短字符串。

你看到的 ADODB 类型库的作者使用的技巧,他在 dbUse 前加上了前缀。这是您看到的 .NET 库导出器使用的技巧,它在枚举类型名称前加上前缀。重要的是你看到自己在使用这个技巧,你在 Test 前面加上了前缀。可能是你不知不觉做了什么,你只是习惯了。

但这在 VB.NET 中不再合适或必要。编写该枚举的更明智的方法是:

<ComVisible(True)> _
Enum Test
    Type1 = 1
    Type2 = 2
    Type3 = 3
End Enum

并且您会在 VB.NET 代码中使用 Test.Type1 而不是丑陋的重言式 TestTypes.TestType1

现在,类型库导出器会生成更可口的枚举成员名称,例如 Test_Type1

如果不进行大手术,您将无法摆脱下划线,您必须用 IDL 编写声明(就像 ADODB 作者所做的那样)并将 MIDL 生成的类型库导入回您的程序中。不完全值得麻烦。