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};
指针与二维数组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++代码的意思是,将N*N的元素按照从上到下,从左⾄右,对每个元素从1开始赋值,本案例⽤的matrix数组是100×100的,所以赋值区间为1~10000,messagebox输出的是第99⾏第99列,即最后⼀个元素,故为10000.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。