【发布时间】:2011-02-14 09:51:36
【问题描述】:
我有一个 C++ 函数,它生成一个有趣的矩形列表。我希望能够将该列表从 C++ 库中取出并返回到调用它的 C# 应用程序中。
到目前为止,我正在像这样对矩形进行编码:
struct ImagePatch{
int xmin, xmax, ymin, ymax;
}
然后编码一些向量:
void MyFunc(..., std::vector<int>& rectanglePoints){
std::vector<ImagePatch> patches; //this is filled with rectangles
for(i = 0; i < patches.size(); i++){
rectanglePoints.push_back(patches[i].xmin);
rectanglePoints.push_back(patches[i].xmax);
rectanglePoints.push_back(patches[i].ymin);
rectanglePoints.push_back(patches[i].ymax);
}
}
与 C# 交互的标头看起来像(并且适用于一堆其他函数):
extern "C" {
__declspec(dllexport) void __cdecl MyFunc(..., std::vector<int>& rectanglePoints);
}
我可以做一些关键字或其他事情来得到这组矩形吗?我发现this article 用于在 C# 中编组对象,但它似乎太复杂且解释不足。整数向量是正确的方法吗,还是有其他技巧或方法?
【问题讨论】:
-
这并不是真正的“编组”。编组将获取您的 C++ 对象,编写一些表示它的二进制数据,并让 C# 读取该二进制数据以在其他环境中构造相应的对象。您正在尝试将参数从 C# 代码传递到 C++ 代码,并让 C++ 代码对其进行修改。
-
好的,那么我怎样才能做到这一点,使我从 C++ 端得到的内容是任意长度的?
-
好吧,如果您想避免在 C++ 中编写“适当的”托管 .NET 对象,如该 MSDN 文章中所述,则可以:从 C++ 返回一个 malloced 缓冲区(并在您'已经完成了它);重新设计您的 API,以便 C# 可以传入要填充的缓冲区和长度,并且 C++ 代码可以以某种方式告诉 C# 该缓冲区需要多大;重新设计 API,以便为每个值从 C++ 回调到 C# 一次,并将其添加到 C# 集合中。我对 C#(或与 C# 中的其他语言的接口)了解不足,无法判断哪个更容易/更好。
-
如果您的 C++ 代码可以在 .NET 中运行,或者使用 C# 和 C++ 中的 .NET 容器之一。
-
是的,我已经决定将一个大缓冲区传递给 C++,并希望它足以满足实际用途。不过,对于 .NET 和本机代码之间的互操作服务而言,这似乎是一个相当大的漏洞。
标签: c# .net c++ stl marshalling