博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#调用C++编写的DLL函数, 以及各种类型的参数传递 z
阅读量:7089 次
发布时间:2019-06-28

本文共 1965 字,大约阅读时间需要 6 分钟。

1. 如果函数只有传入参数,比如:

C/C++ Code
Copy Code To Clipboard
  1. //C++中的输出函数
  2. int__declspec(dllexport) test(constint N)
  3. {
  4. return N+10;
  5. }

对应的C#代码为:

C# Code
Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. publicstaticexternint test(int m);
  3.  
  4. privatevoid button1_Click(object sender, EventArgs e)
  5. {
  6. textBox1.Text= test(10).ToString();
  7. }

2. 如果函数有传出参数,比如:

C/C++ Code
Copy Code To Clipboard
  1. //C++
  2. void__declspec(dllexport) test(constint N, int& Z)
  3. {
  4. Z=N+10;
  5. }

对应的C#代码:

C# Code
Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. publicstaticexterndouble test(int m, refint n);
  3.  
  4. privatevoid button1_Click(object sender, EventArgs e)
  5. {
  6. int N = 0;
  7. test1(10, ref N);
  8. textBox1.Text= N.ToString();
  9. }

3. 带传入数组:

C/C++ Code
Copy Code To Clipboard
  1. void__declspec(dllexport) test(constint N, constint n[], int& Z)
  2. {
  3. for (int i=0; i<N; i++)
  4. {
  5. Z+=n[i];
  6. }
  7. }

C#代码:

C# Code
Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. publicstaticexterndouble test(int N, int[] n, refint Z);
  3.  
  4. privatevoid button1_Click(object sender, EventArgs e)
  5. {
  6. int N = 0;
  7. int[] n;
  8. n = newint[10];
  9. for (int i = 0; i < 10; i++)
  10. {
  11. n[i] = i;
  12. }
  13. test(n.Length, n, ref N);
  14. textBox1.Text= N.ToString();
  15. }

4. 带传出数组:

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

C/C++ Code
Copy Code To Clipboard
  1. void__declspec(dllexport) test(constint M, constint n[], int *N)
  2. {
  3. for (int i=0; i<M; i++)
  4. {
  5. N[i]=n[i]+10;
  6. }
  7. }

对应的C#代码:

C# Code
Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. publicstaticexternvoid test(int N, int[] n, [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Z);
  3.  
  4. privatevoid button1_Click(object sender, EventArgs e)
  5. {
  6. int N = 1000;
  7. int[] n, Z;
  8. n = newint[N];Z = newint[N];
  9. for (int i = 0; i < N; i++)
  10. {
  11. n[i] = i;
  12. }
  13. test(n.Length, n, Z);
  14. for (int i=0; i<Z.Length; i++)
  15. {
  16. textBox1.AppendText(Z[i].ToString()+"n");
  17. }
  18. }

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

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

关于MarshalAs的参数用法以及数组的Marshaling,可以参见这篇转帖的文章:

转载地址:http://goyql.baihongyu.com/

你可能感兴趣的文章
何为DOM对象
查看>>
linux的yum仓库配置
查看>>
XSUPERSMS COME ON
查看>>
[JS2] JS是弱类型
查看>>
企业搜索引擎开发之连接器connector(二十四)
查看>>
数学图形(1.9)悬链线
查看>>
有上下界的网络流问题
查看>>
AspectJ获取方法注解的信息
查看>>
获取泛型的class 反射
查看>>
input 获取当前id,name
查看>>
linux zip 命令详解
查看>>
HDU 4902 Nice boat(线段树)
查看>>
Codeforces Round #114 (Div. 1) E. Wizards and Bets 高斯消元
查看>>
怎样调通微信支付及微信发货通知接口(Js API)
查看>>
Android 属性动画(Property Animation) 全然解析 (下)
查看>>
推断汉字正則表達式更严谨方法!
查看>>
如何避免误删CleanMyMac语言文件
查看>>
Linux下免安装mysql
查看>>
jquery实现返回基部案例效果
查看>>
快钱报错:javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name解决
查看>>