3

私は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 ライブラリを作成するにはどうすればよいですか?

4

2 に答える 2

2

最初に最後の質問に答えます。必要なのは、COM ライブラリではなく TypeLib です。COM インターフェイスが一連のコードと関数ポインターである場合、TypeLib はそれらのポインターと対話するためのマップです (定義と列挙型、およびその他の一連のものと共に)。これらが組み合わさって初めて、COM ライブラリができあがります。COM インターフェイスがないため、COM ライブラリを持つことはできません。

Microsoft は、インターフェースなしで TypeLibを作成する方法の例を提供しています。それはあなたが説明したものと非常によく似ています。お気づきのとおり、COM インターフェイスはありません。このため、低 TypeLib のままにする必要があります。

次の問題は、.NET アセンブリです。TlbImp.exeを使用して列挙型をコードにインポートすると、それらの列挙型をコード内 (アセンブリ内) で使用できるようになります。それが列挙型でできることの限界です。これらの列挙型は .NET コードに属していないため、エクスポートできません。列挙型は TypeLib によって所有されます。.NET コードには列挙型を使用する権限がありますが、列挙型を所有していると主張することはできません。

最後に、最初の質問に答えます。.NET で提供される機能を使用する必要があります。列挙型を定義してエクスポートし、COM から表示できるようにする機能があります。命名規則に対するフラストレーションは理解していますが、これは回避したり回避したりすべきものではありません。これまで見てきたように、命名規則に関するこの小さな問題を回避しようとすると、大きな問題が発生し、事実上、新しいコードが使用できなくなります。

于 2011-08-06T08:39:11.597 に答える
2

私はこれをしました:

.NET で、次のような列挙型を持つ PermissionControlLib という名前の COM 可視ライブラリを作成しました。

public enum NetOperations
{
   Oper1,
   Oper2,
   Oper3
}

VB6 では、次のような別の列挙型を作成しました。

Public Enum VBOperations
   Oper1=NetOperations.NetOperations_Oper1,
   Oper2=NetOperations.NetOperations_Oper2,
   Oper3=NetOperations.NetOperations_Oper3
End Enum

使用法:

Dim ud as PermissionControlLib.IUser
Set ud = New User
Dim b as Boolean
b = ud.HasPermissionInOperation(VbOperations.Oper1)
于 2013-10-14T14:52:28.100 に答える