Вопрос

У меня есть сборка .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()
{
//...
}
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top