C# Enum を COM Interop 呼び出し元に公開することは可能ですか? 公開できる場合、どのようにすればよいですか?
質問
COM 相互運用経由で呼び出されるマネージド アセンブリがあります。VBScript クライアントや Perl クライアントなどと同様です。
クラスに飾られているのは、
[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]
それからもちろん、私はリガスムのことを行います、そして、すべての方法はうまくいきます。
ただし、アセンブリには列挙型もあります。enum 値には、COM アプリケーションのシンボリック名を使用したいと考えています。
COM 相互運用経由で列挙型を公開するにはどうすればよいですか?これらの属性を追加するだけでよいでしょうか?
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]
それでは、VBScript でこれらのシンボリック名を参照するにはどうすればよいでしょうか?OleView に列挙型が表示されません。(そうすべきでしょうか?) OleView には他のすべての型が表示されます。
解決
VBScript およびその他の遅延バインド クライアントは、IDispatch を使用してオブジェクトのメソッドを呼び出します。そのため、これらの言語は typelib 内の型情報にアクセスできません。GUID からオブジェクトを作成し、IDispatch ポインターを取得して、名前によるメソッドの呼び出しを開始するだけです。
質問の COM 相互運用部分についてはわかりませんが、たとえ列挙型が OleView に表示されたとしても、それらを直接使用することはできません。
ただし、typelib で列挙型を公開できる場合は、typelib のすべての列挙型を定数として含むスクリプト ファイル (vbs または js) を生成できるツールを私はずっと前に書きました。
ここを参照してください: http://www.kontrollbehov.com/tools/tlb2const/
他のヒント
私はCOM-見えるように私の(今のところのみ).NETアセンブリはまたOLEVIEWでうまく現れた列挙型を、持っていました。私は、全体のライブラリはCOM-表示されていたので、
[ComVisible(true)]
必要はありませんでした。あなたの列挙型の公共のですか?
異なる列挙型は、「列挙型名」で「接頭辞」されたということでしたが起こったことの一つ_ます:
public enum DataType
{
INT32,
FLOAT64,
INT8
}
になってます:
typedef [...]
enum {
DataType_INT32 = 0,
DataType_FLOAT64 = 1,
DataType_INT8 = 2
} DataType;
タイプライブラリでます。
私は、これは非常に古いスレッドですけど、私は、将来の探検家のための私の2セントを追加します。私はC#で列挙型を定義するとき、私は[のGUID(...)、のComVisible(真)]ないGuidAttributeとそれを飾る。
たとえばます:
[Guid("28637488-C6B3-44b6-8621-867441284B51"), ComVisible(true)]
public enum myEnum
{
first,
second,
third,
fourth
}
次に列挙myEnum_first、myEnum_secondとしてVB6になど利用可能である。
あなたにもそのリストにあるキー値の割り当てを含めることができますので、最初の1 =は、列挙に有効になります。