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++:double **——C#:double[,]
再来二维数组的传递方式:
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);
}
}
}
//=============================使用代码==========================
double[,] matrix = new double[N,N] ;
DLLImportHelper.Assist_test_double_2groups(matrix,N);
MessageBox.Show(matrix[99,99].ToString());
以上代码需要注意的几个点:
首先,在C#中对指针的操作,需要加关键字unsafe;
其次,unsafe添加完后,需要在“项目——属性设置——生成”中,允许不安全代码前打√,这样才能发运行辅助函数的主体函数,否则unsafe段程序运行会报错。
这些操作完毕后,就可以在主函数中调用自己构造的辅助系列函数了,当然,辅助函数可以根据个人需要,更改返回类型,不太建议把一个模块函数弄的太复杂,这样容易弄错,宁可多分几个模块;
这些代码没有删减,直接拷贝后可以直接运行。结果是弹出窗口 显示10000
原C++代码的意思是,将N*N的元素按照从上到下,从左至右,对每个元素从1开始赋值,本案例用的matrix数组是100×100的,所以赋值区间为1~10000,messagebox输出的是第99行第99列,即最后一个元素,故为10000.
————————————————
版权声明:本文为CSDN博主「宿大人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41692285/article/details/103870884