我正在做一個COM-interop項目。用C#和.NET Interop替換一些VB和C++ ATL COM項目。當我在.NET中定義枚舉並將它們設置爲ComVisible時,它們會以Typelib.EnumType_EnumValue的形式暴露給Typelib.EnumValue。 typelib導出器會這樣做,以確保值名稱是唯一的。但我知道我所有的枚舉都是獨一無二的,所以我不想下劃線。還有很多客戶代碼需要改變,如果我沒有擺脫下劃線。創建只包含枚舉的COM庫的問題
要找到這個問題的解決方案,我已經在一個IDL文件中定義了枚舉,並從中創建了一個typelib和.net interop。
[
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創建一個程序集。使用與其他Interop程序集相同的密鑰簽署程序集。
TLBIMP OpenStructureAdapterEnum.tlb /keyfile:KeyFile.snk
然後我註冊regasm.exe 裝配該組件看起來很好,並沒有包含下劃線枚舉。但問題是,無法從OLE/COM Object Viewer或VBA或VB6中看到COM庫。當我從另一個COM暴露的程序集引用枚舉時,包含對枚舉引用的接口部分將作爲resticted方法公開。
[restricted] void Missing7();
[restricted] void Missing8();
[restricted] void Missing9();
[restricted] void Missing10();
如何創建一個只包含枚舉(不帶下劃線)並引用其他.net互操作程序集的COM庫?