当前位置: 代码迷 >> C# >> C# 透过 CLR 调用C++ 代码
  详细解决方案

C# 透过 CLR 调用C++ 代码

热度:532   发布时间:2016-05-05 02:38:45.0
C# 通过 CLR 调用C++ 代码
我需要在 C# winForm 程序中,使用很多C++的算法代码。
目前的方案是使用一个 CLR 的 DLL来实现。

目前的问题是,很多C++算法的函数参数都是 int + double* ,传递一个 double数组的长度和内容。。同时计算结果也以 double* 的方式写回

C++ 函数声明:
int func(int count, double* valList, double* result);    // count 和 valList是传入参数,result 是保存计算结果

这在C# 和 CLR 的类定义中怎么传递参数呢?


下面是我的代码结构示例:
Solution:
-- CLR 类库
    -- C++ 算法代码
    -- CLR 封装类,封装C++函数调用
-- WinForm 应用(引用以上类库工程)
    -- C# 代码,调用CLR类的API



小弟.net 初学者,希望能给出代码示例,包含CLR类和C#代码中的声明和使用,非常感谢。。。。


------解决思路----------------------
声明
[DllImport(dll文件名)]
static extern int func(int count, double[] valList, double[] result);


调用
double[] valList = new double[]{1,2,3};
double[] result = new double[valList.Length];
int x = func(valList.Length, valList, result);

------解决思路----------------------
我的实验代码,测试通过。

C#端调用:

            CLILib.Class1 cls = new Class1();

            double[] d1 = {0.1, 0.2, 0.3, 0.4};
            double[] d2 = new double[d1.Length];

            cls.func(d1, d2);



CLI和C++的代码:


public ref class Class1
{
public:
int func(array<double>^ valList, array<double>^ result)
{
int length = valList->Length;
pin_ptr<double> pvalList = &valList[0];
pin_ptr<double> pResult = &result[0];

return internalFunc(length, pvalList, pResult);
}

private :
int internalFunc(int count, double* pvalList, double* pResult)
{
for(int i = 0; i< count; ++i)
{
pResult[i] = pvalList[i];
}

return 0;
}

};
  相关解决方案