一直认为带导出类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. 【CF802C】Heidi and Library(网络流)

    [CF802C]Heidi and Library(网络流) 题面 CF 洛谷 题解 前面两个Easy和Medium都是什么鬼玩意啊.... 不难发现如果这天的要求就是第\(a_i\)种书的话,那么\ ...

  2. IIS最小配置

    目的 : IIS按需要配置练习      测试环境 IIS 10  WIN10 1.安装IIS与建立网站 安装IIS略,服务器版用添加角色,用户版添加删除WINDOWS组件. 装好IIS之后,建一个网 ...

  3. uvaLive6837 ThereIsNoAlternative (kruskal)

    题意:给一个联通图,求出不可替代的边,即存在于所有最小生成树中的边,的数量和它们边权之和 首先kruskal跑出一个最小生成树,枚举其中所有的边,若把这条边去掉以后再跑kruskal答案不是最小,则这 ...

  4. bzoj4481非诚勿扰(期望dp)

    有n个女性和n个男性.每个女性的如意郎君列表都是所有男性的一个子集,并且可能为空.如果列表非空,她们会在其中选择一个男性作为自己最终接受的对象.将“如意郎君列表”中的男性按照编号从小到大的顺序呈现给她 ...

  5. Python数据结构之栈的实现

    一图胜千言,看图! 代码code: #coding:utf-8 #常见数据结构之栈的实现 class Stack(): #创建Stack类 def __init__(st,size): st.stac ...

  6. 百度地图API示例:使用vue添加删除覆盖物

    1.index.html <script type="text/javascript" src="http://api.map.baidu.com/api?v=2. ...

  7. 【POJ2226】Muddy Fields

    题目大意:给定一个 N*M 的图,图中有一些格子不能被任何东西覆盖,现有一些宽度为 1,长度任意的骨牌覆盖这些可以被覆盖的格子,骨牌之间可以重叠,求将所有可以被覆盖的格子覆盖所需的最小骨牌数是多少. ...

  8. WebClient请求接口,get和post方法

    1,get方式 string URI = "url"; //实例化 WebClient client = new WebClient(); // client.UseDefault ...

  9. [luogu3391][文艺平衡树]

    题目链接 思路 splay区间操作的裸题. 假如要对l-r这段区间操作,那么就先把l-1伸展到根节点,然后把r +1伸展为根的儿子.这样r + 1的左儿子就是要操作的区间了.只要在上面打上标记,以后每 ...

  10. (转)每天一个linux命令(44):top命令

    背景:在面试时候面试官问到关于linux服务器下内存优化的问题.自己之前可能接触过也没有深入总结过. top命令 每天一个linux命令(44):top命令