2012-01-18 14 views
7

La mia prima domanda qui :)Come passare un elenco di oggetti da C++ a C#?

Sto lavorando con un'applicazione scritta in C++ (un editor di mappe per un gioco) che ha l'interfaccia utente di front-end scritta in C#. Dal momento che sono nuovo di C# sto cercando di fare il più possibile sul lato C++.

Da C# voglio chiamare una funzione C++ che restituirà un elenco di strutture con tipi di variabile semplici (int e string) in modo da poter popolare un listBox che ho con l'interfaccia utente. È possibile? Come dovrei scrivere la funzione dll import in C#?

Ho provato a cercare qui la risposta, ma ho trovato solo post su come passare liste da C# a C++.

Il codice C++:

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 funzione di C# di importazione:

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

EDIT:

Dopo il post di Ed S. Ho cambiato il codice C++ per struct propData { 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]; 
} 

e il C# per [DllImport ("MapEditor.dll")] extern statico propData GetPropData();

struct PropData 
    { 
     string myName; 
     int myID; 
    } 

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

ma naturalmente questo non può essere compilato come GetPropData() non restituisce tutto ciò che si traduce in una lista.

Grazie mille Ed S. per avermi portato così lontano!

risposta

9

Non è possibile eseguire il marshalling dello std::vector nel territorio C#. Quello che dovresti fare invece è restituire un array. Rispettare i tipi di base rende le cose molto più semplici quando si affrontano situazioni di interoption.

std::vector garantisce che & v [0] punti al primo elemento e che tutti gli elementi siano memorizzati in modo contiguo, quindi è sufficiente passare di nuovo l'array. Se sei bloccato con l'interfaccia C++ così com'è (che non penso che tu sia) dovrai esaminare un meccanismo più complesso come COM.

+0

Non poteva anche usare una struttura? Ovviamente sarebbe più facile fare tutto in una sola lingua. Se il front-end è scritto in C# dovrebbe essere possibile fare tutto in C#. –

+0

Grazie per la rapida risposta, ma ho bisogno di più aiuto con la sintassi C#, come ho detto sono nuovo nel linguaggio (appena iniziato oggi), non sapevo nemmeno che potesse gestire i puntatori. – Cousken

+0

@Ramhound: Non vedo come sarà possibile creare una struttura C# che riproduca esattamente un 'std :: vector'. Questo funziona solo per i tipi di POD. –