私はCOM相互運用プロジェクトをやっています。一部のVBおよびC++ ATL COMプロジェクトをC#および.NET Interopに置き換えます。私が列挙型を.NETで定義し、ComVisibleにすると、Typelib.EnumType_EnumValueが単にTypelib.EnumValueのensteadとして公開されます。 typelibエクスポータは、値の名前が一意であることを保証するためにこれを行います。しかし私はすべての列挙型がユニークであることを知っているので、私は下線を必要としません。また、アンダースコアを取り除かなければ、変更が必要なクライアントコードがたくさんあります。enumを含む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;
};
私は、tlbファイルを生成するMIDL.exeでタイプライブラリを作成します。
そして、私はtlbimp.exeを使ってアセンブリを作成します。他のInteropアセンブリと同じキーを使用してアセンブリに署名します。
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ライブラリを作成するにはどうすればよいですか?