Как вернуть массив объектов .NET с помощью метода COM
-
20-09-2019 - |
Вопрос
У меня есть сборка .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 собирается упорядочить возврат, он захлебывается.Как я уже сказал, он отлично работает с массивами целых чисел или строк.Что мне нужно сделать с моим классом, чтобы его можно было вернуть в массиве?
Так получилось, что мой класс будет содержать только пару строк и целое число (без методов), если это облегчит задачу.Очевидно, я пытался вернуть непустой массив и классы, которые на самом деле содержат некоторые данные, это всего лишь самый простой случай, иллюстрирующий проблему.
Решение
Вам необходимо реализовать IDispatch
и Enumerator
метод
public ref class FooCollection{
[DispId(-4)]
public IEnumerator^ GetEnumerator()
{
//...
}
}