C#调用C++编写的DLL函数, 以及各种类型的参数传递 z
2016-05-24 10:22
441 查看
C#调用C++编写的DLL函数, 以及各种类型的参数传递 z
1. 如果函数只有传入参数,比如:C/C++ Code Copy Code To Clipboard
//C++中的输出函数
int__declspec(dllexport)
test(constint N)
{
return N+10;
}
对应的C#代码为:
C# Code Copy Code To Clipboard
[DllImport("test.dll", EntryPoint = "#1")]
publicstaticexternint test(int m);
privatevoid button1_Click(object sender,
EventArgs e)
{
textBox1.Text= test(10).ToString();
}
2. 如果函数有传出参数,比如:
C/C++ Code Copy Code To Clipboard
//C++
void__declspec(dllexport)
test(constint N, int&
Z)
{
Z=N+10;
}
对应的C#代码:
C# Code Copy Code To Clipboard
[DllImport("test.dll", EntryPoint = "#1")]
publicstaticexterndouble test(int m, refint n);
privatevoid button1_Click(object sender,
EventArgs e)
{
int N = 0;
test1(10, ref N);
textBox1.Text= N.ToString();
}
3. 带传入数组:
C/C++ Code Copy Code To Clipboard
void__declspec(dllexport)
test(constint N, constint n[], int&
Z)
{
for (int i=0;
i<N; i++)
{
Z+=n[i];
}
}
C#代码:
C# Code Copy Code To Clipboard
[DllImport("test.dll", EntryPoint = "#1")]
publicstaticexterndouble test(int N, int[]
n, refint Z);
privatevoid button1_Click(object sender,
EventArgs e)
{
int N = 0;
int[] n;
n = newint[10];
for (int i
= 0; i < 10; i++)
{
n[i] = i;
}
test(n.Length, n, ref N);
textBox1.Text= N.ToString();
}
4. 带传出数组:
C++不能直接传出数组,只传出数组指针,
C/C++ Code Copy Code To Clipboard
void__declspec(dllexport)
test(constint M, constint n[], int *N)
{
for (int i=0;
i<M; i++)
{
N[i]=n[i]+10;
}
}
对应的C#代码:
C# Code Copy Code To Clipboard
[DllImport("test.dll", EntryPoint = "#1")]
publicstaticexternvoid test(int N, int[]
n, [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Z);
privatevoid button1_Click(object sender,
EventArgs e)
{
int N = 1000;
int[] n, Z;
n = newint
;Z = newint
;
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[]
Z
在C#中数组是直接使用的,而在C++中返回的是数组的指针,这句用来转化这两种不同的类型.
关于MarshalAs的参数用法以及数组的Marshaling,可以参见这篇转帖的文章: http://www.kycis.com/blog/read.php?21
转载自http://www.cnblogs.com/zeroone/p/3681370.html
相关文章推荐
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#比较二个数组并找出相同或不同元素的方法