2012-01-18 18 views
7

Burada ilk sorum var :)C++ ile C# arasındaki nesnelerin listesi nasıl iletilir?

C++ ile yazılmış ön uç kullanıcı arabirimine sahip C++ (oyun için bir harita düzenleyicisi) ile yazılmış bir uygulamada çalışıyorum. C# 'den yeni olduğum için C++ tarafında olabildiğince fazla yapmaya çalışıyorum.

C# ile basit değişken türleri (int ve dize) içeren yapıların bir listesini döndürecek bir C++ işlevini çağırmak istiyorum; Mümkün mü? C# dll içe aktarma işlevini nasıl yazmalıyım?

Yanıt için burayı aramayı denedim, ancak yalnızca C# 'dan C++' a kadar listelerin nasıl iletileceğine dair yazı buldum.

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

C# aktarım fonksiyonu:

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

DÜZENLEME: yapı PropData C++ kodu değiştirildi Ed S'den yazı sonra

{ PropData (const std :: dize aName, const int, bir) { 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]; 
} 

ve C# [Dllımport ("MapEditor.dll")] statik Harici PropData GetPropData();

struct PropData 
    { 
     string myName; 
     int myID; 
    } 

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

Ancak, GetPropData() bir listeye dönüşen herhangi bir şey döndürmediği için bu işlem derlenmez.

Bana bu kadar uzaklaştığınız için çok teşekkürler Ed S.

cevap

9

std::vector C# bölgesine yerleştirilemezsiniz. Bunun yerine yapmanız gereken bir dizi döndürmektir. Temel türlere yapışmak, birlikte çalışma durumları karşısında işleri çok daha basit hale getirir. & [0] birinci eleman ve tüm elemanları bitişik saklanır işaret v bu

std::vector garanti, yani sadece bir dizi geri geçmektedir. C++ arabiriminde olduğu gibi sıkışmışsanız (ki siz böyle olduğunu sanmıyorum) COM gibi daha karmaşık bir mekanizmaya bakmanız gerekecektir.

+0

Ayrıca bir yapı kullanamadı mı? Elbette her şeyi tek bir dilde yapmak daha kolay olur. Ön uç C# ile yazılırsa, C# 'da her şeyi yapmak mümkün olmalıdır. –

+0

Hızlı yanıt için teşekkürler, ancak C# sözdizimi ile ilgili daha fazla yardıma ihtiyacım var, dil için yeni olduğumu söylediğim gibi (bugün başladım), işaretçilerle başa çıkabileceğini bile bilmiyordum. – Cousken

+0

@Ramhound: Tam olarak bir std :: vektörünü taklit eden bir C# yapısını nasıl oluşturabileceğinizi göremiyorum. Bu sadece POD tipleri için çalışır. –

İlgili konular