如何通过COM方法返回.NET对象数组

时间:2009-11-16 20:37:18

标签: .net com c++-cli com-interop safearray

我有一个.NET程序集。它碰巧是用C ++ / CLI编写的。我通过COM暴露了一些对象。一切都运行正常,但我不能为我的生活弄清楚如何从方法返回我自己的对象数组。每次我这样做,我都会在运行时遇到类型不匹配错误。我可以返回一个整数或字符串数​​组。

这是我的主要课程

[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(没有方法),如果这样可以更容易。显然我已经尝试返回一个非空数组和实际包含一些数据的类,这只是说明问题的最简单的情况。

1 个答案:

答案 0 :(得分:0)

您需要实施IDispatchEnumerator方法

public ref class FooCollection{
[DispId(-4)]
public IEnumerator^ GetEnumerator()
{
//...
}
}