分享

C#调用C++编写的DLL函数, 以及各种类型的参数传递 (转载)

 灞河之滨 2018-06-13

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

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

对应的C#代码为:

C# Code Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. public static extern int test(int m);
  3.  
  4. private void 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(const int N, int& Z)
  3. {
  4. Z=N+10;
  5. }

对应的C#代码:

C# Code Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. public static extern double test(int m, ref int n);
  3.  
  4. private void 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(const int N, const int 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. public static extern double test(int N, int[] n, ref int Z);
  3.  
  4. private void button1_Click(object sender, EventArgs e)
  5. {
  6. int N = 0;
  7. int[] n;
  8. n = new int[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(const int M, const int 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. public static extern void test(int N, int[] n, [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Z);
  3.  
  4. private void button1_Click(object sender, EventArgs e)
  5. {
  6. int N = 1000;
  7. int[] n, Z;
  8. n = new int[N];Z = new int[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://www./blog/read.php?21

5. 传出字符数组:

C++定义:

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

C#对应声明:

C# Code Copy Code To Clipboard
  1. [DllImport("dll.dll", EntryPoint = "test")]  
  2. public static extern void test(int i, ref double a, ref double b, [Out, MarshalAs(UnmanagedType.LPArray)] char[] t);   
  3. 。。。  
  4.             char[] t = new char[5];  
  5.             test(i, ref a, ref b, t);  

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多