如何将对象列表从C++传递到C#
How to pass a list of objects from C++ to C#?
我的第一个问题是:)
我正在使用一个用C++(游戏的地图编辑器)编写的应用程序,该应用程序的前端UI是用C#编写的。由于我是C#的新手,我正在努力在C++方面做尽可能多的工作。
在C#中,我想调用一个C++函数,该函数将返回一个具有简单变量类型(int和string)的结构列表,这样我就可以用它们填充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++代码更改为结构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")]静态外部PropData GetPropData();
struct PropData
{
string myName;
int myID;
}
private void GetPropDataFromEditor()
{
List<PropData> myProps = GetPropData();
}
但这当然不会编译,因为GetPropData()不会返回任何转换为列表的内容。
非常感谢Ed S.让我走到这一步!
您将无法将std::vector
编组到C#区域。您应该做的是返回一个数组。在面对互操作情况时,坚持使用基本类型会使事情变得更加简单。
CCD_ 2保证&v[0]指向第一个元素,并且所有元素都是连续存储的,所以只需将数组传回即可。如果你一直使用C++接口(我不认为你是这样),你将不得不研究一些更复杂的机制,比如COM.
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象