2012-01-18 22 views
7

Mi primera pregunta aquí :)¿Cómo pasar una lista de objetos de C++ a C#?

Estoy trabajando con una aplicación escrita en C++ (un editor de mapas para un juego) que tiene la interfaz de usuario del front-end escrita en C#. Como soy nuevo en C# estoy tratando de hacer todo lo posible en el lado de C++.

Desde C# deseo llamar a una función de C++ que devolverá una lista de estructuras con tipos de variables simples (int y cadena) para que pueda poblar una listBox que tengo en la UI con ellas. es posible? ¿Cómo debo escribir la función de importación dll en C#?

He intentado buscar aquí la respuesta, pero solo encontré una publicación sobre cómo pasar listas de C# a C++.

El C++ código:

struct PropData 
{ 
PropData(const std::string aName, const int aId) 
{ 
    myName = aName; 
    myID = aId; 
} 

std::string myName; 
int myID; 
}; 

extern "C" _declspec(dllexport) std::vector<PropData> _stdcall GetPropData() 
{ 
std::vector<PropData> myProps; 

myProps.push_back(PropData("Bush", 0)); 
myProps.push_back(PropData("Tree", 1)); 
myProps.push_back(PropData("Rock", 2)); 
myProps.push_back(PropData("Shroom", 3)); 

return myProps; 
} 

La función C# importación:

[DllImport("MapEditor.dll")] 
    static extern ??? GetPropData(); 

EDIT:

Después de que el poste de Ed S. He cambiado el ++ código c para PropData struct { PropData (const std :: string aName, const int aId) { myName = aName; myID = aId; }

std::string myName; 
    int myID; 
}; 

extern "C" _declspec(dllexport) PropData* _stdcall GetPropData() 
{ 
    std::vector<PropData> myProps; 

    myProps.push_back(PropData("Bush", 0)); 
    myProps.push_back(PropData("Tree", 1)); 
    myProps.push_back(PropData("Rock", 2)); 
    myProps.push_back(PropData("Shroom", 3)); 

    return &myProps[0]; 
} 

y el C# para [DllImport ("MapEditor.dll")] extern estático PropData GetPropData();

struct PropData 
    { 
     string myName; 
     int myID; 
    } 

    private void GetPropDataFromEditor() 
    { 
     List<PropData> myProps = GetPropData(); 
    } 

pero por supuesto esto no se compila como GetPropData() no devuelve nada de lo que se traduce en una lista.

¡Muchas gracias Ed S. por llevarme tan lejos!

Respuesta

9

No va a poder ordenar el std::vector en el territorio C#. Lo que debe hacer en su lugar es devolver una matriz. Cumplir con los tipos básicos hace que las cosas sean mucho más simples cuando se enfrentan situaciones de interoperabilidad.

std::vector garantiza que & v [0] apunta al primer elemento y que todos los elementos se almacenan contiguamente, por lo que simplemente devuelva la matriz. Si está atascado con la interfaz C++ tal como está (que no creo que sea), tendrá que buscar algún mecanismo más complejo como COM.

+0

¿No podría él también podría usar una estructura? Por supuesto, sería más fácil hacer todo en un solo idioma. Si el front-end está escrito en C#, debería ser posible hacer todo en C#. –

+0

Gracias por la respuesta rápida, pero necesito más ayuda con la sintaxis de C#, ya que dije que soy nuevo en el lenguaje (recién empecé hoy), ni siquiera sabía que podía manejar punteros. – Cousken

+0

@Ramhound: no veo cómo será capaz de crear una estructura C# que imite exactamente un 'std :: vector'. Eso solo funciona para los tipos de POD. –

Cuestiones relacionadas