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.

Foi útil?

Solução

Você precisa implementar IDispatch e a Enumerator método

public ref class FooCollection{
[DispId(-4)]
public IEnumerator^ GetEnumerator()
{
//...
}
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top