一直认为带导出类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)

C#调用C++导出类的一个实例的更多相关文章

  1. java中检测-在运行时指定对象是否是特定类的一个实例---关键字 instanceof

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. if(requ ...

  2. C#调用C++导出类(转)

    由于使用别人的Dll,导出的是一个实体类,在C#里封送很难,百度下,有个朋友回复一篇英文的,虽然不一定使用,但可以作为一个知识点,现把原文贴下: c#调用C++写的dll导出类,包含继承,重载等详细介 ...

  3. Spring JDBC 框架使用JdbcTemplate 类的一个实例

    JDBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等.但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQ ...

  4. (转)C++类库开发之导出类设计原则

    上一篇博客详细陈述了类库开发的各个知识点(http://blog.csdn.net/z702143700/article/details/45989993),本文将进一步陈述,对于类库开发过程中导出类 ...

  5. C++ DLL导出类 知识大全

    在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架.在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发. 参考了很多这方面的资料,对DLL有一个基本全面的了解.有一个问题 ...

  6. Python之路-面向对象&继承和多态&类属性和实例属性&类方法和静态方法

    一.面向对象 编程方式 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强…” 什么是面 ...

  7. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  8. 一个使用CSocket类的网络通信实例

    http://www.cppblog.com/changshoumeng/archive/2010/05/14/115413.html 3.8 一个使用CSocket类的网络通信实例 本例采用CSoc ...

  9. Delphi调用C++导出的QT类

    打开VS2008创建一个dll项目(创建了一个QT Library项目),新建头文件q4dapplication.h定义纯虚类: #ifndef Q4DAPPLICATION#define Q4DAP ...

随机推荐

  1. [CF976E]Well played!

    题目描述 Recently Max has got himself into popular CCG "BrainStone". As "BrainStone" ...

  2. 【转】gcc 编译使用动态链接库和静态链接库

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...

  3. asp.net处理事件

    从来不用也从来不研究这事件.但为了写那种CGI式的接口不得已研究一下. 环境  W10 VS2017 测试方法:写一个实现IHttpModule接口的类,在Init方法中加载所有事件然后打出日志,看看 ...

  4. nc 使用实例

    nc.exe -h即可看到各参数的使用方法.基本格式:nc [-options] hostname port[s] [ports] ...nc -l -p port [options] [hostna ...

  5. c++ sort

    老是搞混 return bool eg. bool cmp(node a,node b) { if (a.score==b.score) ; else return a.score>b.scor ...

  6. snpeff注释变异(variants)

    1.进入网站http://snpeff.sourceforge.net/,下载snpeff: wget http://sourceforge.net/projects/snpeff/files/snp ...

  7. c#文件管理

    Directory类-------目录管理 Directory.CreateDirectory(_Path); bool IsExit=Directory.Exists(_Path); Directo ...

  8. (map)What Are You Talking About hdu1075

    What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K ...

  9. es6基础知识总结(附加)

    附加: 字符串扩展: 1. includes(str) : 判断是否包含指定的字符串2. startsWith(str) : 判断是否以指定字符串开头3. endsWith(str) : 判断是否以指 ...

  10. python自动化开发-[第二十一天]-form验证,中间件,缓存,信号,admin后台

    今日概要: 1.form表单进阶 2.中间件 3.缓存 4.信号 5.admin后台 上节课回顾 FBV,CBV 序列化 - Django内置 - json.dumps(xxx,cls=) Form验 ...