2011-07-05 16 views
3

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

答えて

0

あなたの最後の質問に最初に答えてください。あなたが望んでいるのはTypeLibで、COMライブラリではありません。 COMインターフェイスがコードポインタと関数ポインタの束である場合、TypeLibはそれらのポインタと相互作用するためのマップです(定義と列挙、そして他のものと一緒に)。彼らが一緒に来た時だけ、COMライブラリがあります。 COMインターフェイスがないため、COMライブラリを持つことはできません。

マイクロソフトでは、create a TypeLib without an interfaceの例を提供しています。これはあなたが記述したものと非常に似ています。気づくように、COMインターフェイスはありません。このため、TypeLibを低く保つ必要があります。

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

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

1

私はこれをしました:

です。NET、私はこのような列挙型でPermissionControlLibという名前のCOM見えるライブラリを作成しました:

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) 
VB6で

public enum NetOperations 
{ 
    Oper1, 
    Oper2, 
    Oper3 
} 

、私はこのような別の列挙型を作成しました

関連する問題