Pregunta

Tengo un ensamblado de .NET. Le pasa a ser escrito en C ++ / CLI. Estoy exponiendo algunos objetos a través de COM. Todo está funcionando bien, pero no puedo por la vida de a averiguar cómo devolver una matriz de mis propios objetos de un método. Cada vez que lo hago, me sale un error de coincidencia de tipos en tiempo de ejecución. Puedo devolver una matriz de enteros o cadenas muy bien.

Aquí está mi clase 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);
    }
};

Esta es la clase que voy a volver

[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 es mi (nativo) código C ++ que llama:

MyNamespace::IFooPtr session(__uuidof(MyNamespace::Foo));
// For simplicity, don't even check the return.
session->GetStuff();

Llamando GetStuff () me consigue un _com_error 0x80020005 (DISP_E_TYPEMISMATCH). Puedo decir a mi método está siendo llamado correctamente, es sólo que cuando .NET / COM va a ordenar el regreso, se ahoga. Como ya he dicho, que funciona bien con matrices de enteros o cadenas. ¿Qué tengo que hacer para mi clase para que pueda ser devuelta en una matriz?

Da la casualidad de mi clase sólo contendrá un par de cuerdas y un int (no hay métodos), si es que lo hace más fácil. Obviamente, yo he intentado devolver un array y clases que realmente contienen algunos datos que no está vacía, esto es sólo el caso más sencillo que ilustra el problema.

¿Fue útil?

Solución

Es necesario implementar IDispatch y el método Enumerator

public ref class FooCollection{
[DispId(-4)]
public IEnumerator^ GetEnumerator()
{
//...
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top