COMメソッドを経由して、.NETオブジェクトの配列を返す方法
-
20-09-2019 - |
質問
私は、.NETアセンブリを持っています。 C ++ / CLIで書かれたことを起こります。私はCOM経由でいくつかのオブジェクトを露出させています。すべてが正常に動作しているが、私は私の人生のための方法から自分のオブジェクトの配列を返す方法を見つけ出すことはできません。私がやるたびに、私は、実行時に型の不一致エラーが発生します。私はちょうど罰金int型や文字列の配列を返すことができます。
ここ
私のメインクラスです[Guid("7E7E69DD-blahblah")]
[ClassInterface(ClassInterfaceType::None)]
[ComVisible(true)]
public ref class Foo sealed : IFoo
{
public:
virtual array<IBar^>^ GetStuff();
}
[Guid("21EC1AAA-blahblah")]
[InterfaceType(ComInterfaceType::InterfaceIsIDispatch)]
[ComVisible(true)]
public interface class IFoo
{
public:
virtual array<IBar^>^ GetStuff()
{
// For simplicity, return an empty array for now.
return gcnew array<IBar^>(0);
}
};
ここで私は戻っていたクラス
[Guid("43A37BD4-blahblah")]
[InterfaceType(ComInterfaceType::InterfaceIsIDispatch)]
[ComVisible(true)]
public interface class IBar
{
// Completely empty class, just for testing.
//In real life, I would like to return two strings and an int.
};
[Guid("634708AF-blahblah")]
[ClassInterface(ClassInterfaceType::None)]
[ComVisible(true)]
[Serializable]
public ref class Bar : IBar
{
};
これは、それを呼び出す私の(ネイティブ)C ++コードです
MyNamespace::IFooPtr session(__uuidof(MyNamespace::Foo));
// For simplicity, don't even check the return.
session->GetStuff();
GetStuff()を呼び出す_com_errorの0x80020005(DISP_E_TYPEMISMATCH)私を取得します。私はそれはそれはチョーク、.NET / COMマーシャルへの復帰を行くときということだけだ、私のメソッドが正しく呼び出されている伝えることができます。私が言ったように、それはint型または文字列の配列で正常に動作します。私はそれを配列で返すことができるように私のクラスに何をすべきかを持っていますか?
それはそれはどの容易になります場合は、それは偶然にも、私のクラスは、文字列のカップルとint型(無メソッド)が含まれています。もちろん、私はこの問題を示しているだけの最も単純なケースで、実際にいくつかのデータが含まれている非空の配列やクラスを返す試してみた。
解決
あなたはIDispatch
とEnumerator
メソッドを実装する必要があります。
public ref class FooCollection{
[DispId(-4)]
public IEnumerator^ GetEnumerator()
{
//...
}
}
所属していません StackOverflow