zoukankan      html  css  js  c++  java
  • C#调用C++编写的dll

    界面还是C#写的方便点,主要是有一个可视化的编辑器,不想画太多的时间在界面上。但是自己又对C++了解的多一些,所以在需要一个良好的界面的情况下,使用C++来写代码逻辑,将其编译成一个dll,然后用C#写界面,

    1.C++编写的dll代码如下:

    extern "C" __declspec(dllexport) int testAdd(int a,int b)
    {
        return a+b;
    }
    
    //一个简单测试字符类型的例子
    extern "C" __declspec(dllexport) void testString(
        const char* cszBuffer,
        char* szBuffer,
        int nBuffSize)
    {
        if(strcmp(cszBuffer,"type1") == 0)
        {
            strncpy(szBuffer,"输入的是type1
    ",nBuffSize);
        }else if(strcmp(cszBuffer,"type2") == 0)
        {
            strncpy(szBuffer,"输入的是type2
    ",nBuffSize);
        }else
        {
            strncpy(szBuffer,"other type
    ",nBuffSize);
        }
    }
    
    //回调函数类型定义
    typedef int (CALLBACK *PMYCALLBACKFUN)( const char* msgs);
    
    
    extern "C" __declspec(dllexport) int testCallBack(PMYCALLBACKFUN fun)
    {
        fun("dll中输出的字符串
    ");
        return 0;
    }

    这里导出了三个函数,分别用来测试简单类型参数传递,字符串传递以及测试函数回调。

    2.C#中调用代码如下:

    //这里根据dll中的函数名填写
            [DllImport("testdll.dll", EntryPoint = "testAdd", CallingConvention = CallingConvention.Cdecl)]
            private static extern int CSharpTestAddFun(int a, int b);
    
            [DllImport("testdll.dll", EntryPoint = "testString", CallingConvention = CallingConvention.Cdecl)]
            private static extern int CSharpTestString(string str, StringBuilder sb, int size);
    
            public delegate int MyTestCallBackFun(string str);
            [DllImport("testdll.dll", EntryPoint = "testCallBack", CallingConvention = CallingConvention.Cdecl)]
            private static extern int CSharpTestCallBack(MyTestCallBackFun fun);
    
    
            //测试dll中加法函数
            private void button1_Click(object sender, EventArgs e)
            {
                textBox1.Text = CSharpTestAddFun(1, 2).ToString();
            }
    
            //测试dll中的字符串
            private void button2_Click(object sender, EventArgs e)
            {
                string strText = "";
                StringBuilder sb = new StringBuilder(100);
                CSharpTestString("type1", sb, 100);
                strText += sb.ToString();
                CSharpTestString("type2", sb, 100);
                strText += sb.ToString();
                CSharpTestString("sss", sb, 100);
                strText += sb.ToString();
                sb = null;
                textBox1.Text = strText;
            }
    
            //给dll调用的回调
            private int CSharpCallBackFun(string str)
            {
                textBox1.AppendText(str);
                return 0;
            }
            private void button3_Click(object sender, EventArgs e)
            {
                CSharpTestCallBack(CSharpCallBackFun);
            }

    调用过程简单点就是先定义导出函数:

    [DllImport("testdll.dll", EntryPoint = "testAdd", CallingConvention = CallingConvention.Cdecl)]
            private static extern int CSharpTestAddFun(int a, int b);

    这样就可以在C#中使用这个函数了。

    复杂点就是字符串传递了。

    C# string对应C++中的const char*

    C# StringBuilder对应C++中的char*

    3.测试程序

    按钮1按下,调用dll中的加法函数:

    image

    按钮2按下,调用字符串传递函数:

    image

    按钮3按下,调用Dll中的测试回调函数:

    image

    4.文件下载

    相关VS2010工程文件下载地址

  • 相关阅读:
    linux的vim按了ctrl+s之后假死的解决办法
    linux下的终端模拟器urxvt的配置
    vim下正则表达式的非贪婪匹配
    linux中的一个看图的软件
    解决windows的控制台显示utf8乱码的问题
    [PHP][位转换积累]之异或运算的简单加密应用
    [PHP][REDIS]phpredis 'RedisException' with message 'read error on connection'
    [PHP][位转换积累]之与运算截取二进制流的值
    [PHP][位转换积累]之pack和unpack
    [正则表达式]PCRE反向分组引用
  • 原文地址:https://www.cnblogs.com/Reyzal/p/4971886.html
Copyright © 2011-2022 走看看