C#调用C++的dll各类传参

1. 若是函数只有传入参数,好比:php

//C++中的输出函数
int __declspec(dllexport) test(const int N) { return N+10; }

对应的C#代码为:数组

[DllImport("test.dll", EntryPoint = "#1")] public static extern int test(int m); private void button1_Click(object sender, EventArgs e) { textBox1.Text= test(10).ToString(); }

 

2. 若是函数有传出参数,好比:函数

void __declspec(dllexport) test(const int N, int& Z) { Z=N+10; }

对应的C#代码:spa

[DllImport("test.dll", EntryPoint = "#1")] public static extern double test(int m, ref int n); private void button1_Click(object sender, EventArgs e) { int N = 0; test1(10, ref N); textBox1.Text= N.ToString(); }

 

3. 带传入数组:指针

void __declspec(dllexport) test(const int N, const int n[], int& Z) { for (int i=0; i<N; i++) { Z+=n[i]; } }

 

C#代码:code

[DllImport("test.dll", EntryPoint = "#1")] public static extern double test(int N, int[] n, ref int Z); private void button1_Click(object sender, EventArgs e) { int N = 0; int[] n; n = new int[10]; for (int i = 0; i < 10; i++) { n[i] = i; } test(n.Length, n, ref N); textBox1.Text= N.ToString(); }

 

4. 带传出数组:blog

C++不能直接传出数组,只传出数组指针,ip

void __declspec(dllexport) test(const int M, const int n[], int *N) { for (int i=0; i<M; i++) { N[i]=n[i]+10; } }

 

对应的C#代码:ci

[DllImport("test.dll", EntryPoint = "#1")] public static extern void test(int N, int[] n, [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Z); private void button1_Click(object sender, EventArgs e) { int N = 1000; int[] n, Z; n = new int[N];Z = new int[N]; for (int i = 0; i < N; i++) { n[i] = i; } test(n.Length, n, Z); for (int i=0; i<Z.Length; i++) { textBox1.AppendText(Z[i].ToString()+"n"); } }

 

这里声明函数入口时,注意这句 [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Zget

在C#中数组是直接使用的,而在C++中返回的是数组的指针,这句用来转化这两种不一样的类型.

关于MarshalAs的参数用法以及数组的Marshaling,能够参见这篇转帖的文章: http://www.kycis.com/blog/read.php?21

 

5. 传出字符数组:

C++定义:

C/C++ Code Copy Code To Clipboard
void __declspec(dllexport) test(int i, double &a, double &b, char t[5])

C#对应声明:

[DllImport("dll.dll", EntryPoint = "test")] public static extern void test(int i, ref double a, ref double b, [Out, MarshalAs(UnmanagedType.LPArray)] char[] t); 。。。 char[] t = new char[5]; test(i, ref a, ref b, t);

字符数组的传递基本与4类似,只是mashalAs 时前面加上Out。

相关文章
相关标签/搜索