我在这里的第一个问题 :)
我正在使用C++编写的应用程序(游戏地图编辑器),它的前端UI是用C#编写的。由于我对C#很陌生,所以我尽可能多地在C++方面进行操作。
我想从C#中调用一个返回简单变量类型(int和string)结构体列表的C++函数,以便我可以在UI中使用listBox来填充它们。这个可能吗?我应该如何在C#中编写dll导入函数?
我已经尝试搜索答案,但我只找到了有关如何将列表从C#传递到C++的帖子。
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;
}
C#导入函数:
[DllImport("MapEditor.dll")]
static extern ??? GetPropData();
编辑:
在 Ed S. 的帖子之后,我将 C++ 代码更改为 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];
}
并且C#中需要使用以下代码来调用:
[DllImport("MapEditor.dll")]
static extern PropData GetPropData();
struct PropData
{
string myName;
int myID;
}
private void GetPropDataFromEditor()
{
List<PropData> myProps = GetPropData();
}
当然,这段代码无法编译,因为GetPropData()没有返回任何可以转换为列表的内容。
非常感谢Ed S.让我有了这么多进展!
std::vector
的 C# 结构体,这仅适用于 POD 类型。 - Ed S.