C#调用C++DLL数组,结构体传递

C#调用C++DLL数组,结构体传递

本文例子是C#静态调用C++DLL中函数的一维数组,通过结构体传递的方式。已验证。
二维数组也可以通过结构体传递的方式传递,方法二维数组先转换成一维数组,然后按照下述。这里不多做表述,有需要请参看下一篇文章。(还没顾得上写)
照猫画虎。
例子实现功能:Sn=a+bn(n>=0)
即Sn[0]=S0=a+b
0,
Sn[1]=S1=a+b1,
Sn[2]=S2=a+b
2

C++DLL

.cpp中
void _cdecl addTest(GetSn &&sn,const double a, const double b, const int n) {
     
	double *Sn = new double[n + 1]();//创建一个动态一维数组Sn并初始化,用来接收所有结果
	Sn[0] = a;//当n=0时,Sn值
	for (int i = 1; i <= n; i++) {
     
		Sn[i] = Sn[i - 1] + b;//当n>0时,Sn值
	}
	for (int i = 0; i <= n; i++) {
     
		sn._s[i] = Sn[i];//把Sn的值传递给sn._s
	}
	//sn._s[0] = a;     //下面三行为上面的总结,下三行没验证,应该没什么问题,
	//for (int i = 1; i <= n; i++) {  //仅仅觉得上面设Sn可能更好理解一点
	//	sn._s[i] = sn._s[i-1] + b;//当n>0时,Sn值
	//}
}
.h中
struct GetSn//结构体
{
     
public:
	double _s [50];//字段数字,数组大小为50,根据自己需求分配大小
}; 
extern "C" DATAANALYSISDLL_API void _cdecl addTest(GetSn& sn, double a, double b, int n);//导出函数addTest函数

C#

.cs中
    public struct GetSn//结构体
    {
     
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]//注意:字段数组大小为50,与C++DLL头文件中分配的大小要一致
        public double[] _s;
    };
//DLL路径,函数名,…
        [DllImport("C:\\Users\\Duan\\Documents\\Visual Studio 2015\\Projects\\AddTestDLL\\Debug\\ AddTestDLL.dll",
        EntryPoint = "addTest",
        CallingConvention = CallingConvention.Cdecl)]
        public static extern void addTest(ref GetSn sn, double a, double b, int n);

main函数中

    double a = 2;
    double b = 3;
    int n = 0;
    GetSn snn = new GetSn();
    addTest(ref snn, a, b, n);
    for (int i = 0; i <= n; i++)
    {
     
        Console.Write("S" + i + ":" + snn._s[i] + "  ");
    }

运行结果如下(直接程序里改变量a,b,n 就不写输入语句了):
当n=0时:
在这里插入图片描述

当n=4时:
在这里插入图片描述

。。。

你可能感兴趣的:(C#调用C++DLL,dll,c++,c#,数组)