Como devolver uma matriz de objetos .NET através de um método COM
-
20-09-2019 - |
Pergunta
Eu tenho uma montagem .NET. Acontece que foi escrito em C ++/CLI. Estou expondo alguns objetos via com. Tudo está funcionando bem, mas não posso para a vida minha descobrir como devolver uma matriz de meus próprios objetos de um método. Toda vez que faço, recebo um erro de incompatibilidade de tipo em tempo de execução. Eu posso devolver uma variedade de INTs ou Strings muito bem.
Aqui está minha aula principal
[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);
}
};
Aqui está a aula que estou voltando
[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
{
};
Este é o meu código C ++ (nativo) que o chama:
MyNamespace::IFooPtr session(__uuidof(MyNamespace::Foo));
// For simplicity, don't even check the return.
session->GetStuff();
Chamar getstuff () me leva um _com_error 0x80020005 (DISP_E_TYPEMIMPATH). Eu posso dizer que meu método está sendo chamado corretamente, é apenas que quando .NET/COM vai para marcar o retorno, ele engasga. Como eu disse, funciona bem com matrizes de ints ou cordas. O que tenho que fazer na minha classe para permitir que ela seja devolvida em uma matriz?
Por acaso, minha classe conterá apenas algumas cordas e um INT (sem métodos), se isso facilitar. Obviamente, tentei devolver uma matriz não vazia e as classes que realmente contêm alguns dados, este é o caso mais simples que ilustra o problema.
Solução
Você precisa implementar IDispatch
e a Enumerator
método
public ref class FooCollection{
[DispId(-4)]
public IEnumerator^ GetEnumerator()
{
//...
}
}