Как вернуть массив объектов .NET с помощью метода COM - PullRequest
2 голосов
/ 16 ноября 2009

У меня есть сборка .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 голосов
/ 17 ноября 2009

Вам нужно реализовать IDispatch и метод Enumerator

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