2012-01-18 18 views
7

Moje pierwsze pytanie tutaj :)Jak przekazać listę obiektów z C++ do C#?

Pracuję z aplikacją napisaną w C++ (edytor map do gry), która ma interfejs użytkownika napisany w języku C#. Ponieważ jestem nowy w C# próbuję zrobić jak najwięcej po stronie C++.

Z C# Chcę wywołać funkcję C++, która zwróci listę struktur z prostymi typami zmiennych (int i string), dzięki czemu mogę wypełnić listę listBox w interfejsie użytkownika. czy to możliwe? Jak napisać funkcję import DLL w C#?

Próbowałem szukać tutaj odpowiedzi, ale znalazłem tylko post, w jaki sposób przekazywać listy z C# do C++.

C++ Kod:

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; 
} 

funkcji C# importu:

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

Edycja:

Po postu Ed S. zostały zmienione kodu C++, aby 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]; 
} 

i C# [DllImport ("MapEditor.dll")] statyczny zewnętrzny PropData GetPropData();

struct PropData 
    { 
     string myName; 
     int myID; 
    } 

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

ale oczywiście to nie kompiluje jako GetPropData() nie wszystko, co przekłada się na liście wrócić.

Wielkie dzięki Ed S. za dotarcie do tego miejsca!

Odpowiedz

9

Nie będziesz w stanie skierować std::vector na terytorium C#. Zamiast tego powinieneś zwrócić tablicę. Trzymanie się podstawowych typów sprawia, że ​​staje się o wiele łatwiejsze w obliczu sytuacji interakcji.

std::vector gwarantuje, że & v [0] wskazuje na pierwszy element i że wszystkie elementy są przechowywane w sposób ciągły, więc wystarczy przekazać tablicę z powrotem. Jeśli utknąłeś z interfejsem C++ takim, jaki jest (co nie wydaje mi się, że jesteś), będziesz musiał zajrzeć do bardziej złożonego mechanizmu, takiego jak COM.

+0

Czy nie mógłby również użyć konstrukcji? Oczywiście łatwiej byłoby zrobić wszystko w jednym języku. Jeśli front-end jest napisany w C#, powinno być możliwe zrobienie wszystkiego w C#. –

+0

Dziękuję za szybką odpowiedź, ale potrzebuję więcej pomocy w składni języka C#, ponieważ powiedziałem, że jestem nowy w tym języku (dopiero zaczynałem dzisiaj), nie wiedziałem nawet, że poradzi sobie ze wskaźnikami. – Cousken

+0

@Ramhound: Nie widzę sposobu, w jaki będzie można stworzyć strukturę C#, która dokładnie naśladuje 'std :: vector'. Działa to tylko dla typów POD. –

Powiązane problemy