六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 37|回复: 0

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

[复制链接]

升级  61.33%

116

主题

116

主题

116

主题

举人

Rank: 3Rank: 3

积分
384
 楼主| 发表于 2013-1-26 14:02:12 | 显示全部楼层 |阅读模式
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#需要在程序上做一些修改(因其语言存在差异性)
 
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表