У меня есть сборка .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 (без методов), если это облегчит задачу. Очевидно, я попытался вернуть непустой массив и классы, которые на самом деле содержат некоторые данные, это просто простейший случай, иллюстрирующий проблему.