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

如何通过COM方法返回.NET对象数组,.net,com,c++-cli,com-interop,safearray,.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 { pu

我有一个.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);
    }
};

这是我的(原生)C++代码,称之为:

MyNamespace::IFooPtr session(__uuidof(MyNamespace::Foo));
// For simplicity, don't even check the return.
session->GetStuff();
调用GetStuff()会得到一个_com_错误0x80020005(DISP_E_TYPEMISMATCH)。我可以说我的方法被正确调用了,只是当.NET/COM去处理返回时,它阻塞了。正如我所说,它可以很好地处理int或string数组。我必须对我的类做什么才能允许它以数组的形式返回


碰巧,我的类将只包含几个字符串和一个int(没有方法),如果这使它更容易的话。显然,我已经尝试返回一个非空数组和实际包含一些数据的类,这只是说明问题的最简单的例子。

您需要实现
IDispatch
枚举器
方法

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

您需要实现
IDispatch
枚举器
方法

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

所以我不能只返回一个数组,我必须编写自己的集合类并公开它?令人失望,但我认为不太难。@mhenry1384,如果是正确的,那么它应该是可能的。所以我不能只返回一个数组,我必须编写自己的集合类并公开它?令人失望,但我认为不太难。@mhenry1384,如果是正确的,那么它应该是可能的。