在 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&lt;T&gt;'s 或 List's。

也可能是您引用了static externINTcalibrate_to_file() 在 C++ 中它是 VOIDcalibrate_to_file()

更新: 而且我认为您缺少函数上的DLLEXPORT 标签?

【讨论】:

我在预处理器中使用了_DLLEXPORT,不知道是不是一样

以上是关于在 C++ 和 C# 之间传递向量结构的主要内容,如果未能解决你的问题,请参考以下文章

c++ 以最佳方式返回结构和向量

如何将结构数组从 c++ 传递到 c#?

将结构传递给 C#

C++ 将向量传递给重载类 - 有些调用语句有效,有些则无效。

将字节数组从 c++ 传递到 c#(单声道)

C++:使用 int 指针指向在函数内部创建的向量