• C#调用C++编写的DLL函数, 以及各种类型的参数传递 z


    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://www.kycis.com/blog/read.php?21

  • 相关阅读:
    CentOS7 安装 RabbitMQ
    测试工程师 - 要了解的技能总结
    STF 连接其它操作系统上的安卓设备实操介绍【转】
    adb -a server nodaemon,设备一直显示 offline,而 adb devices 一直显示 device【已解决】
    Mac 之 STF 搭建(淘宝源安装)
    无损压缩图片
    jenkins 之 Android 打包及上传至蒲公英
    JoinPoint
    元数据库 information_schema.tables
    @RestControllerAdvice全局异常统一处理
  • 原文地址:https://www.cnblogs.com/zeroone/p/3681370.html
Copyright © 2020-2023  润新知