zoukankan      html  css  js  c++  java
  • C#调用C++的dll各种传参

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

    //C++中的输出函数
    int __declspec(dllexport) test(const int N)
    {
        return N+10;
    }

    对应的C#代码为:

    [DllImport("test.dll", EntryPoint = "#1")]
    public static extern int test(int m);
         
    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text= test(10).ToString();
    }

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

    void __declspec(dllexport) test(const int N, int& Z)
    {
        Z=N+10;
    }

    对应的C#代码:

    [DllImport("test.dll", EntryPoint = "#1")]
    public static extern double test(int m, ref int n);
         
    private void button1_Click(object sender, EventArgs e)
    {
        int N = 0;
        test1(10, ref N);
        textBox1.Text= N.ToString();
    }

    3. 带传入数组:

    void __declspec(dllexport) test(const int N, const int n[], int& Z)
    {
        for (int i=0; i<N; i++)
        {
            Z+=n[i];
        }
    }

    C#代码:

    [DllImport("test.dll", EntryPoint = "#1")]
    public static extern double test(int N, int[] n, ref int Z);
         
    private void button1_Click(object sender, EventArgs e)
    {
        int N = 0;
        int[] n;
        n = new int[10];
        for (int i = 0; i < 10; i++)
        {
            n[i] = i;
        }
        test(n.Length, n, ref N);
        textBox1.Text= N.ToString();
    }

    4. 带传出数组:

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

    void __declspec(dllexport) test(const int M, const int n[], int *N)
    {
        for (int i=0; i<M; i++)
        {
            N[i]=n[i]+10;
        }
    }

    对应的C#代码:

    [DllImport("test.dll", EntryPoint = "#1")]
    public static extern void test(int N, int[] n, [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Z);
         
    private void button1_Click(object sender, EventArgs e)
    {
        int N = 1000;
        int[] n, Z;
        n = new int[N];Z = new int[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

    5. 传出字符数组:

    C++定义:

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

    C#对应声明:

    [DllImport("dll.dll", EntryPoint = "test")]  
    public static extern void test(int i, ref double a, ref double b, [Out, MarshalAs(UnmanagedType.LPArray)] char[] t);   
        。。。  
    char[] t = new char[5];  
    test(i, ref a, ref b, t);  

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

  • 相关阅读:
    robotframework使用之 下拉框处理
    Python操作MySQL
    Python发送邮件
    Redis 常用命令
    安装htop教程及坑
    探索式测试-概述
    Git相关命令教程
    [精华][推荐]SSO CAS单点登录框架学习 环境搭建
    [精华][推荐]SSO CAS单点登录框架学习 搭建详细步骤及源码
    [精华][推荐]CAS实现单点登录实例源码
  • 原文地址:https://www.cnblogs.com/xieqianli/p/9152492.html
Copyright © 2011-2022 走看看