2009-08-14 10 views
10

COM Interop経由で呼び出されるマネージアセンブリがあります。 VBScriptクライアント、Perlクライアントなどと同様です。C#EnumをCOM Interop呼び出し元に公開することは可能ですか?

クラスはもちろんのその後

[ClassInterface(ClassInterfaceType.AutoDual)] 
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")] 
[ComVisible(true)] 

が飾られています私はします。regasmのことを行うと、すべてのメソッドはうまく動作します。

しかし、アセンブリには列挙型もあります。私は列挙型の値のために記号的な名前COMアプリケーションを使用したいと思います。

COM相互運用機能で列挙型を公開するにはどうすればよいですか?これらの属性を追加するだけでいいですか?

[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")] 
[ComVisible(true)] 

次に、これらの記号名をVBScriptでどのように参照しますか?私はOleViewで列挙型が表示されません。 (私は?)私はOleViewの他のすべてのタイプを参照してください。

答えて

3

VBScriptおよびその他の遅延バインドクライアントは、IDispatchを使用してオブジェクトのメソッドを呼び出します。そのため、これらの言語は、タイプライブラリの型情報にアクセスすることはできません。単にGUIDからオブジェクトを作成し、IDispatchポインタを戻し、名前でメソッドを呼び出すことができます。

質問のCOM interop部分が不明ですが、列挙型がOleViewに表示されたとしても、それらを直接使用することはできません。あなたはタイプライブラリに列挙型を公開することができれば

しかし、私は、スクリプトファイルの定数として、タイプライブラリからのすべての列挙型を含む(VBSやJS)を生成することができ、そのツールの大昔に書きました。

ここを参照してください:私はCOM-見えるようhttp://www.kontrollbehov.com/tools/tlb2const/

+0

そのツールは非常に便利な音です。 – Cheeso

+0

残念ながら、私はPerlの定数ジェネレータを持っていません...おそらく、開発をもう一度やり直す時間です:-) –

9

私(今のところのみ).NETアセンブリもOLEVIEWにうまく現れた列挙型を、持っていました。私は図書館全体をCOMで見ることができました。

[ComVisible(true)] 

は必要ありませんでした。あなたの列挙型は公開されていますか?タイプライブラリに

typedef [...] 
enum { 
    DataType_INT32 = 0, 
    DataType_FLOAT64 = 1, 
    DataType_INT8 = 2 
} DataType; 

public enum DataType 
{ 
    INT32, 
    FLOAT64, 
    INT8 
} 

がになって:起こっ

一つは、異なる列挙型は、列挙型のname'_」で '接頭辞' されたということでした。

+0

プロジェクトがComVisible(true)として設定されているときに、すべてのenumが正常に動作していましたが、 VS6 C++プロジェクトでasmを使用するには、tlbが大きすぎます!!私はプロジェクト全体を誤って設定し、私が望むクラスと列挙型を公開しました。クラスは大丈夫です、enumはありません!!彼らは予想通りregsitry(CLSID)にいますが、単にアクセスできません。理由を知ることに非常に興味があります.. –

+1

COMが魔法のようにあなたのenum値の名前を変更して、ここ以外の列挙型の名前を付けるという明確な説明が見つからなかったので、Upvoted。 –

関連する問題