3

我有我想从 c# 访问的 c++ 非托管代码。所以我遵循了一些教程,并为我的项目构建了一个 dll(顺便说一句,只有一个类)。现在我想从 c# 中使用它,我正在使用 p/invoke,如下所示。

我的问题是:是否可以编组我的 windows 点,以便我可以将它作为向量传递到我的 c++ 代码中?我可以更改所有代码(除了 qwindows 点,但我可以提出自己的观点)。有没有我不必创建交流包装器的解决方案?我在关注这个问题: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();
    };
}
4

2 回答 2

4

您可以将 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++结构与 System.Windows.Point 不兼容。后者没有z成员。

但是你的代码的一个更大的问题是你不能真的期望通过 DLL 导入一个实例方法并能够像那样调用它。实例方法需要其类的实例,并且没有简单的方法可以从 C# 创建非 COM C++ 类的实例(这也不是一个好主意)。因此,您应该把它变成一个 COM 类,或者为它创建一个 C++/CLI 包装器。

于 2013-03-17T22:54:51.940 回答
1

我认为你应该只传递你的类型的数组,然后vector<T>在相关函数中将它们转换为's 或 List's。

它也可能是您引用了一个static externINTcalibrate_to_file() 而在 C++ 中它是VOID的事实calibrate_to_file()

更新:我认为您缺少DLLEXPORT功能上的标签?

于 2013-03-17T22:00:23.680 回答