DLL和LIB的调用(C++和C#)

1. C++篇

dll(在被调用函数前加_delcspec(dllexport))在生成时会自动生成同名lib(包含dll中的符号链接),直接用dll称为显示调用(动态加载),用LoadLibrary和GetProcAddress;用包含lib的方式为隐式调用(需在调用函数前加_delcspec(dllimport)或extern声明,前者可获得更快的编译速度),编译时不需要对应dll,但运行时程序需要能找到该dll,通常放在debug目录下。可以用dumpbin工具查看dll中包含的函数(dumpbin -exports,但看不到函数原型),用depend工具查看程序的依赖项。为了方便二次开发,需在编写dll时提供一个包含函数原型的同名.h头文件(这样在dll实现程序中的函数原型前不用再加dllexport)。

为了调用和被调用端都可以使用该头文件,在源文件中加

#define DLL_API  _delcspec(dllexport)

#include "xx.h"

在xx.h头文件中加

#ifdef DLL_API

#else

#define DLL_API _delcspec(dllimport)

这样同一文件在两端将实现不同的展开

 

由于C++编译器在编译时会改变函数名,解决方法是

(1)在定义导出函数时加extern "C"(大写),可以解决C++和C语言相互调用问题,但只适合全局函数,不适合类的成员函数;

(2)声明函数时加_stdcall,但函数名仍有可能改变;

(3)使用def文件,强制输出使用的函数名

隐式调用在程序启动时把所需dll全部加载进内存,比较消耗资源。相应库的包含可在工程选项中设置。

 

注:以上主要归纳自 孙鑫《VC++深入详解》

 

QT中调用第三方静态库的方法是在pro里用INCLUDEPATH添加库对应的头文件,用LIBS添加库。

 

2. C#篇

C++的dll是二进制文件,而C#的是一种中间代码,可以添加引用后直接查看,很方便,程序里需using dll中包含的namespace。利用reflector工具可以更清楚的看到其依赖关系。

 

3. 互相调用篇

C++非托管,C#托管,应该是利用公共语言CLR,C#调用C++相对简单,也更有实际意义(利用之前的代码),C++调用C#需要在程序上做一些修改(因其语言存在差异性)

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页