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!
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#. –
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
@Ramhound: Non vedo come sarà possibile creare una struttura C# che riproduca esattamente un 'std :: vector'. Questo funziona solo per i tipi di POD. –