うまくいけば、質問は明確ですが、明確にするためにそれを埋めるために:
C#dllで参照している列挙型を定義するVB6dllがあります。C#dllは、戻り型が列挙型である関数を宣言するidispatchインターフェイスを使用してCCWを正しい方法で定義します。
regasmを実行すると、列挙型がCOMに表示されないため、関数がエクスポートされないという警告が表示されます。VB6ライブラリで定義されているので、COM dllで定義されているので、すでにCOMが表示されていると思います。
混乱をやめ、intを使用して列挙型を渡し、どちらかの端をキャストするだけでよいことに気付きましたが、それは適切なイライラであり、方法が存在するかどうかを知りたいと思います。
ここで要求されているのは、いくつかのサンプルコードです。
VB6dllは列挙型を定義します
Public Enum myEnum
first = 0
second = 1
End Enum
これは相互運用機能を介してC#にインポートされ、メタデータを表示すると次のようになります。
[Guid("EnumGUID")]
public enum myEnum
{
first = 0,
second = 1
}
次に、CCWインターフェイスが定義されます
[ComVisible(true)]
[Guid("InterfaceGuid")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyCCWInterface
{
[DispId(1)]
myEnum myFunction();
}
Regasmは、myEnumがcomに表示されないと文句を言います。メタデータビューにはcomvisible属性がないため、同意する必要があります。不思議なことに、関数の引数にVB dllで定義されている他のタイプを使用すると、文句は表示されません。これは列挙型のように見えます。これは、VB6列挙型の相互運用された実装を実際に公開しているためであり、実際の列挙型。
だから私は問題を理解していると思います。私が知りたいのは、中間コードや自動生成コードのハッキングを伴わない列挙型を使用してこれを機能させる方法があるかどうかです。