【18】C#实战篇——C++函数中 Point2f坐标点怎么传给 C# ? C++ 函数 void cam3Func(cv::Point2f crossPtsDxDy)怎么将参数传给C#?
·
1 问题举例
C++ 中函数 cam3Func(cv::Point2f crossPtsDxDy)中有一个 坐标点crossPtsDxDy,怎么将其实时传给C#呢?
该函数 实时对 相机采集的图片进行处理,左后将处理的数据 通过crossPtsDxDy传给C# ,
下面是函数的 简化版本(仅举例演示用)
void cam3Func(cv::Point2f crossPtsDxDy)
{
crossPtsDxDy.x = (float)mmDx;
crossPtsDxDy.y = (float)mmDy;
}
怎么传给C#,让C# 可以正确接收到crossPtsDxDy的值?
在这种情况下,由于 C++ 函数 cam3Func 中的参数 crossPtsDxDy 是按值传递的,并且在函数内部修改了该参数的值,所以无法直接在 C# 中通过 P/Invoke 来接收修改后的值。你可以通过以下方法来实现:
2 方法1:C++ 引用传递参数
将 cam3Func 修改为按引用传递参数,并且在 C# 中使用 P/Invoke 来调用该函数,将参数声明为 ref;
c++
void cam3Func(cv::Point2f& crossPtsDxDy)
{
crossPtsDxDy.x = (float)mmDx;
crossPtsDxDy.y = (float)mmDy;
}
C#
class Program
{
[DllImport("YourCppLibrary.dll")]
public static extern void cam3Func(ref Point2f crossPtsDxDy);
static void Main(string[] args)
{
Point2f crossPtsDxDy = new Point2f();
cam3Func(ref crossPtsDxDy);
Console.WriteLine($"x: {crossPtsDxDy.x}, y: {crossPtsDxDy.y}");
}
}
3 方法2: C++返回值传递
也可以将 cam3Func 修改为返回值,并且在 C# 中直接获取返回的值。
C++
cv::Point2f cam3Func()
{
cv::Point2f crossPtsDxDy;
crossPtsDxDy.x = (float)mmDx;
crossPtsDxDy.y = (float)mmDy;
return crossPtsDxDy;
}
C#
class Program
{
[DllImport("YourCppLibrary.dll")]
public static extern Point2f cam3Func();
static void Main(string[] args)
{
Point2f crossPtsDxDy = cam3Func();
Console.WriteLine($"x: {crossPtsDxDy.x}, y: {crossPtsDxDy.y}");
}
}
4 注意事项
C++ 函数生成dll时需要加还是那个相应的关键词 ,
__declspec(dllexport) 用于指定 cam3Func 函数要被导出,以便可以从外部调用。使用 extern "C" 保证了 C++ 函数可以按 C 语言的方式导出,以便在 C# 中进行调用。
示例如下,
(这里只是简写,实际使用时相应部分 应写在头文件,不懂的 另查资料)
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) void cam3Func(cv::Point2f& crossPtsDxDy)
{
crossPtsDxDy.x = (float)mmDx;
crossPtsDxDy.y = (float)mmDy;
}
#ifdef __cplusplus
}
#endif
更多推荐

所有评论(0)