zoukankan      html  css  js  c++  java
  • C#调用C++导出类的一个实例 (转)

    https://www.cnblogs.com/zhaogaojian/p/8969451.html

    一直认为带导出类dll的只有VC自己可以调用,其它编程语言无法调用,今天看到一篇文章才知道自己错了。
    https://blog.csdn.net/huiyouyongdeyu2011/article/details/6547931
    一开始“冰yi年华”老哥问我如何调用的时候,我随口一答:这个比较简单……
    后来他告诉我:你的实例是C#调用C++的导出函数,不是导出类……
    我想当然的回答:通俗的说,类不就是多个函数嘛,我马上写一个Demo给你……
    结果被他言中,我失败了,找不到这个EntryPoint
    后来他告诉我:C++不像C#那样支持映射,需要另行处理,于是我就开始百度,找了N久才成功,正好贴出来,留来后用。

    首先我让老哥写了一段C++代码,如下

    #ifdef TESTDLL_EXPORTS
    #define TESTDLL_API __declspec(dllexport)
    #else
    #define TESTDLL_API __declspec(dllimport)
    #endif

    // 此类是从 testdll.dll 导出的
    class TESTDLL_API Ctestdll {
    public:
     Ctestdll(void);
     // TODO: 在此添加您的方法。

    public:
     int Add(int a, int b) {return a+b;}
     int Sub(int a, int b) {return a-b;}
     int Mul(int a, int b) {return a*b;}
    };

    extern TESTDLL_API int ntestdll;

    TESTDLL_API int fntestdll(void);

    这里有一个class :Ctestdll,它有三个function:Add、Sub、Mul,通过使用uedit32查看到它对应的三个导出函数分别是
    1、?Add@Ctestdll@@QAEHHH@Z
    2、?Sub@Ctestdll@@QAEHHH@Z
    3、?Mul@Ctestdll@@QAEHHH@Z

    好了,现在开始做Demo了:

    1、打开VS2008,建一个测试项目WindowsFormsApplication2;

    2、将C++编译的testdll.dll放入bin/Debug(因为我用的是调试模式);

    3、新建一个类库文件,内容如下

    using System;
    using System.Runtime.InteropServices;

    namespace WindowsFormsApplication2
    {
        class Ctestdll
        {
            [DllImport("testdll.dll", EntryPoint = "?Add@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
            private static extern int Add(int a, int b);
            public int myAdd(int a, int b)
            {
                return Add(a, b);
            }
            [DllImport("testdll.dll", EntryPoint = "?Sub@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
            private static extern int Sub(int a, int b);
            public int mySub(int a, int b)
            {
                return Sub(a, b);
            }
            [DllImport("testdll.dll", EntryPoint = "?Mul@Ctestdll@@QAEHHH@Z", CharSet = CharSet.Auto)]
            private static extern int Mul(int a, int b);
            public int myMul(int a, int b)
            {
                return Mul(a, b);
            }
        }
    }

    4、建一个Form  拖放三个TextBox 和三个Button

    5、双击Button,写入如下代码

            private void button1_Click(object sender, EventArgs e)
            {
                Ctestdll test = new Ctestdll();
                this.textBox3.Text = test.myAdd(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();
            }

            private void button2_Click(object sender, EventArgs e)
            {
                Ctestdll test = new Ctestdll();
                this.textBox3.Text = test.mySub(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();

            }

            private void button3_Click(object sender, EventArgs e)
            {
                Ctestdll test = new Ctestdll();
                this.textBox3.Text = test.myMul(Convert.ToInt32(this.textBox1.Text), Convert.ToInt32(this.textBox2.Text)).ToString();

            }

    6、启动调试(或按F5),尝试三个按钮的功能;



     

    7、调试成功。到此C#调用C++导出类的实例结束了,整个实例 关键是找到对应的每个导出函数。

    实例代码:
    点击下载(119.6 KB)

  • 相关阅读:
    Oracle错误——ORA-12704:字符集不匹配
    nodejs 错误问题解决
    windows 卸载 node.js 怎么卸载搜索
    Git安装配置及基本使用(windows)
    破解photoshop cs6 mac
    将text中的数字转换为字符串
    JavaScript 为什么不推荐使用 eval?
    Permission denied (publickey).
    linux 命令
    恢复 git reset -hard 的误操作
  • 原文地址:https://www.cnblogs.com/xihong2014/p/14744112.html
Copyright © 2011-2022 走看看