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

更多推荐