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[N];Z = newint[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[] Z

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

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

    相关文章:

    • 2022-03-09
    • 2022-01-09
    • 2021-10-30
    • 2022-12-23
    • 2021-06-19
    • 2022-12-23
    • 2022-01-23
    猜你喜欢
    • 2022-12-23
    • 2022-12-23
    • 2022-12-23
    • 2022-12-23
    • 2021-06-14
    • 2022-12-23
    • 2021-08-23
    相关资源
    相似解决方案