我正在做一个 COM 互操作项目。用 C# 和 .NET Interop 替换一些 VB 和 C++ ATL COM 项目。当我在 .NET 中定义枚举并将它们设为 ComVisible 时,它们会暴露为 Typelib.EnumType_EnumValue 而不仅仅是 Typelib.EnumValue。typelib 导出器这样做是为了确保值名称是唯一的。但我知道我所有的枚举都是独一无二的,所以我不想要下划线。如果我不去掉下划线,还有很多客户端代码需要修改。
为了找到这个问题的解决方案,我在 IDL 文件中定义了枚举,并从中创建了一个 typelib 和 .Net 互操作。
[
uuid(64893FD4-359D-46B9-BC1E-48C055796104),
version(1.0),
helpstring("ABC"),
helpfile("AAA.chm"),
helpcontext(0x00000001)
]
library EnumTypeLib
{
importlib("stdole2.tlb");
typedef [uuid(8FF85069-C4E2-4540-A277-4C0F3C19B807), helpstring("MyEnum"), helpcontext(0x00000066)]
enum MyEnum {
Value1 = 0,
Value2 = 1,
} MyEnum;
};
我用 MIDL.exe 创建了一个类型库,它生成一个 tlb 文件。
我用 tlbimp.exe 创建了一个程序集。使用与其他互操作程序集相同的密钥对程序集进行签名。
tlbimp OpenStructureAdapterEnum.tlb /keyfile:KeyFile.snk
然后我用 regasm.exe 注册程序集 这个程序集看起来很好,并且包含没有下划线的枚举。但问题是无法从 OLE/COM 对象查看器或 VBA 或 VB6 中看到 COM 库。当我从另一个公开的 COM 程序集中引用枚举时,包含对枚举的引用的接口部分将作为受限方法公开。
[restricted] void Missing7();
[restricted] void Missing8();
[restricted] void Missing9();
[restricted] void Missing10();
如何创建一个只包含枚举(没有下划线)并从其他 .net Interop 程序集中引用这些的 COM 库?