2

.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 (メソッドなし) しか含まれていません。明らかに、実際にいくつかのデータを含む空でない配列とクラスを返そうとしましたが、これは問題を示す最も単純なケースです。

4

1 に答える 1

0

メソッドを実装IDispatchする必要がありますEnumerator

public ref class FooCollection{
[DispId(-4)]
public IEnumerator^ GetEnumerator()
{
//...
}
}
于 2009-11-17T03:30:12.390 に答える