C#与C++编写的dll调用——double数组/一维/二维

传入参数 C++:double*——C#:double[]

C++代码块:

//.cpp
//将传入的数组所有值增加1后返回
_declspec(dllexport) void test_double_group(double *test, int num)
{
	int j = 1;
	for (int i = 0; i <num; i++)
	{
		test[i] += 1;
	}
}
//.h
extern "C" _declspec(dllexport) void test_double_group(double *test, int num);

C#代码块

class DLLImportHelper
{
    [DllImport("SWAP_DLL.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void test_double_group(double[] test,int num);
}
//main
double[] test = { 1, 2, 3 };
DLLImportHelper.test_double_group(test,3);
 for (int i = 0; i < test.Count(); i++)
 {
     MessageBox.Show(test[i].ToString());
 }

result:
2,3,4;

————————以上为一维数组——————
下面开始介绍二维数组的传递方式:
C++代码:

//.cpp
_declspec(dllexport) void test_double_2groups(double **test, int num)
{
	double x = 1;
	for (int i = 0; i <num; i++)
	{
		for (int j = 0; j < num; j++)
			test[i][j] = x++;
	}
}
//.h
extern "C" _declspec(dllexport) void test_double_2groups(double **test, int num);

当前我实现该程序的方式,是采用C#编写辅助函数,再辅助函数中定义指针数组再调用dll相应方法,传入数组,该指针数组存放的是二维数组的每一行的首元素的指针地址,C#中对函数的声明以及辅助函数的定义如下:

//double*[]为指针数组,存放二维数组表格数据类型的每一行row的首元素的地址;
[DllImport("SWAP_DLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern unsafe void test_double_2groups(double*[] matrix,int num);
//辅助函数定义
public static void Assist_test_double_2groups(double[,] myArray,int num)
{
   //获取行维度
   int row = myArray.GetUpperBound(0) + 1;
   //获取列维度
   int col = myArray.GetUpperBound(1) + 1;
   unsafe
   {
       //fp是myArray[0][0]的地址,是整个二维数组的地址,
       //也是二维数组第一行第0个元素的地址,
       fixed (double* fp = myArray)
       {
           //定义指针数组的数组名及维度
           double*[] farr = new double*[row];
           //遍历,把每一行开始的地址,存入指针数组中
           for (int i = 0; i < row; i++)
           {
               farr[i] = fp + i * col;
           }
           //调用dll中对应的函数
           test_double_2groups(farr, num);
       }
   }
 }

以上代码需要注意的几个点:
首先,在C#中对指针的操作,需要加关键字unsafe;
其次,unsafe添加完后,需要在“项目——属性设置——生成”中,允许不安全代码前打√,这样才能发运行辅助函数的主体函数,否则unsafe段程序运行会报错。
这些操作完毕后,就可以在主函数中调用自己构造的辅助系列函数了,当然,辅助函数可以根据个人需要,更改返回类型,不太建议把一个模块函数弄的太复杂,这样容易弄错,宁可多分几个模块;

double[,] matrix = new double[N,N] ;
DLLImportHelper.Assist_test_double_2groups(matrix,N);
MessageBox.Show(matrix[99,99].ToString());

这些代码没有删减,直接拷贝后可以直接运行。
结果如下:
C#与C++编写的dll调用——double数组/一维/二维_第1张图片
原C++代码的意思是,将N*N的元素按照从上到下,从左至右,对每个元素从1开始赋值,本案例用的matrix数组是100×100的,所以赋值区间为1~10000,messagebox输出的是第99行第99列,即最后一个元素,故为10000.

你可能感兴趣的:(C++,C#和Winform)