在 C++ 和 C# 之间传递向量结构
Posted
技术标签:
【中文标题】在 C++ 和 C# 之间传递向量结构【英文标题】:Passing vector struct between C++ and C# 【发布时间】:2013-03-17 21:11:24 【问题描述】:我有想要从 c# 访问的 c++ 非托管代码。所以我遵循了一些教程,并为我的项目构建了一个 dll(顺便说一句,只有一个类)。现在我想从 c# 中使用它,我正在使用 p/invoke,如下所示。
我的问题是:是否可以编组我的 windows 点,以便我可以将它作为向量传递到我的 c++ 代码中?我可以更改所有代码(除了 qwindows 点,但我可以提出自己的观点)。有没有我不必创建 c 包装器的解决方案?我在关注这个问题:How to call an unmanaged C++ function with a std::vector<>::iterator as parameter from C#?
非常感谢1 ps,我找到了一个“解决方案”,但我无法查看它http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21461195.html
c#
using Point = System.Windows.Point;
class CPlusPlusWrapper
[DllImport("EmotionsDLL.dll", EntryPoint = "calibrate_to_file")]
static extern int calibrate_to_file(vector<points> pontos);//marshall here
[DllImport("EmotionsDLL.dll", EntryPoint = "calibration_neutral")]
static extern int calibration_neutral();
/// <summary>
/// wraps c++ project into c#
/// </summary>
public void calibrate_to_file()
dll头
namespace EMOTIONSDLL
struct points
double x;
double y;
double z;
;
#define db at<double>
class DLLDIR EMOTIONS
public:
EMOTIONS();
CvERTrees * Rtree ;
vector<points> mapear_kinect_porto(vector<points> pontos);
void calibrate_to_file(vector<points> pontos);
int calibration_neutral();
int EmotionsRecognition();
;
【问题讨论】:
你试过 static extern int calibrate_to_file(Point[] pontos); 它抛出未处理的异常! 【参考方案1】:您可以将 C# 数组编组为 C++ std::vector,但这会非常复杂并且根本不是一个好主意,因为不保证 std::vector 的布局和实现在编译器版本之间是相同的.
您应该将参数更改为指向数组的指针,并添加一个指定数组长度的参数:
int calibrate_to_file(points* pontos, int length);
并且在 C# 中将该方法声明为采用数组并应用 MarshalAs(UnmanagedType.LPArray) 属性:
static extern int calibrate_to_file([MarshalAs(UnmanagedType.LPArray)]] Point[] pontos, int length);
另请注意,您的 C++ point 结构与 System.Windows.Point 不兼容。后者没有 z 成员。
但是你的代码的一个更大的问题是你不能真的期望通过 DLL 导入一个实例方法并且能够像那样调用它。实例方法需要其类的实例,并且没有简单的方法可以从 C# 创建非 COM C++ 类的实例(这也不是一个好主意)。因此,你应该把它变成一个 COM 类,或者为它创建一个 C++/CLI 包装器。
【讨论】:
我尝试了一些 COM 教程,但它太乱了。你能给我指出一个好的和易于遵循的教程 con cli 包装器吗,我现在不太了解 c++ 或 c#,我来自 java。我也要试试 nefarion 的建议! @virgula24 C++/CLI 是 C++ 的超集,它就像 C++ 一样具有 C# 的一些特性,所以如果你了解 C++ 和 C# 就很容易学习。您可以通过查看一些示例来了解它,这里:msdn.microsoft.com/library/a9e2eysz(en-us,vs.80).aspx【参考方案2】:我认为你应该只传递你的类型的数组,然后在相关函数中将它们转换为vector<T>
's 或 List's。
也可能是您引用了static extern
INTcalibrate_to_file()
在 C++ 中它是 VOIDcalibrate_to_file()
更新:
而且我认为您缺少函数上的DLLEXPORT
标签?
【讨论】:
我在预处理器中使用了_DLLEXPORT,不知道是不是一样以上是关于在 C++ 和 C# 之间传递向量结构的主要内容,如果未能解决你的问题,请参考以下文章