为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过 DllImport 将双精度数组从 C# 传递到 C++

如何通过 DllImport 将双精度数组从 C# 传递到 C++

C#
千巷猫影 2023-07-22 18:12:23
我有一个 C++ 函数,其方法签名为MyMethod(std::vector<double> tissueData, std::vector<double> BGData, std::vector<double> TFData, std::vector<double> colMeans, std::vector<double> colStds, std::vector<double> model)我希望通过 dllimport 在 C# 中调用这个 C++ 函数。在创建 dll 库时,我已将 C++ 端的函数定义为extern "C" __declspec(dllexport) int MyMethod(double *tissue, double *bg, double *tf, double *colMeans, double *colStds, double* model);我计划将一个双精度数组从 c# 端传递到 c++ dll 函数。但是,我不确定应该如何从 C# 端定义 DllImport 以及当我将其解析为 dllImport 函数时应该如何转换双精度数组?我读了一些关于编组的内容,但我仍然不太明白,我不确定它是否可以应用在这里?
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

您不能与 C++ 类(例如std::vector)进行互操作,只能与基本的 C 样式数据类型和指针进行互操作。(作为旁注)这是 Microsoft 在发明 COM 时试图解决的问题之一。


为了使其工作,您应该导出一个不同的函数,该函数接收纯 C 数组及其各自的长度:


C++端

extern "C" __declspec(dllexport) int MyExternMethod(

    double *tissue, int tissueLen, 

    double *bg, int bgLen,

    /* ... the rest ... */

);


// implementation

int MyExternMethod(

    double* tissue, int tissueLen, 

    double* bg, int bgLen,

    /* ... the rest ... */ )

{

    // call your original method from here:


    std::vector<double> tissueData(tissue, tissue + tissueLen);

    std::vector<double> bgData(bg, bg + bgLen);

    /* ... the rest ... */


    return MyMethod(tissueData, bgData, /* ...the rest... */);

}

C# 端的互操作导入为:


C#端

public static class MyLibMethods

{

    [DllImport("MyLib.dll", CallingConvention = CallingConvention.Cdecl)]

    public static extern int MyExternMethod(

        double[] tissue, int tissueLen,

        double[] bg, int bgLen,

        /*...the rest...*/

    );

}

你可以在 C# 中这样调用它:


C#端

public int CallMyExternMethod(double[] tissue, double[] bg, /*... the rest ...*/)

{

    return MyLibMethods.MyExternMethod(

        tissue, tissue.Length,

        bg, bg.Length,

        /*...the rest...*/

    );

}


查看完整回答
反对 回复 2023-07-22
  • 1 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信