私はCOM相互運用プロジェクトを行っています。一部の VB および C++ ATL COM プロジェクトを C# および .NET Interop に置き換えます。.NET で列挙型を定義して ComVisible にすると、Typelib.EnumValue だけでなく、Typelib.EnumType_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;
};
tlb ファイルを生成する MIDL.exe でタイプ ライブラリを作成します。
そして、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 ライブラリを作成するにはどうすればよいですか?