没有合适的资源?快使用搜索试试~ 我知道了~
C#调用外部dll使用方法详解 (3).docx
3 浏览量
2023-01-03
20:13:02
上传
评论
收藏 90KB DOCX 举报
。。。
资源推荐
资源详情
资源评论









一、
动态链接库(也称为 DLL,即为“Dynamic Link Library”的缩写)是 Microsoft Windows最重要
的组成要素之一,打开 Windows 系统文件夹,你会发现文件夹中有很多DLL 文件,Windows 就
是将一些主要的系统功能以 DLL 模块的形式实现。
动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其
它 DLL 调用来完成一定操作的函数(方法。注:C#中一般称为“方法”),但这些函数不是执行程序
本身的一部分,而是根据进程的需要按需载入,此时才能发挥作用。
DLL只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该 DLL
也只能被该进程的线程访问,它的句柄可以被调用进程所使用,而调用进程的句柄也可以被该DLL
所使用。在内存中,一个 DLL 只有一个实例,且它的编制与具体的编程语言和编译器都没有关系,
所以可以通过 DLL 来实现混合语言编程。DLL 函数中的代码所创建的任何对象(包括变量)都归调
用它的线程或进程所有。
1)
当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。这不仅
可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows 操作系统上运行的程序。
2)
DLL 有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具
有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐
程序。
3)
当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。此
外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新
或修复的第三方 DLL 时,此问题可能会更频繁地出现。
二、
DLL的调用
每种编程语言调用 DLL 的方法都不尽相同,在此只对用 C#调用 DLL 的方法进行介绍。首先,您需
要了解什么是托管,什么是非托管。一般可以认为:非托管代码主要是基于 win 32平台开发的 DLL,

activeX 的组件,托管代码是基于.net 平台开发的。如果您想深入了解托管与非托管的关系与区别,
及它们的运行机制,请您自行查找资料,本文件在此不作讨论。
修饰符 extern 返回变量类型 方法名称 (参数列表)
其中:
参数列表:在 DLL 文件中你需调用方法的列表。
DLL 文件必须位于程序当前目录或系统定义的查询路径中(即:系统环境变量中Path 所设置的路
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
static extern int MsgBox(int hWnd, string msg, string caption, int type);
CallingConvention=CallingConvention.Winapi;

1.
2.
3.
4.
extern 声明方法“MsgBox”,将 DllImport 属性附加到该方法,这里我们要使用的是“user32.dll”
中的“MessageBoxA”函数,具体代码如下:
static extern int MsgBox(int hWnd, string msg, string caption, int type);
MsgBox(0," 这就是用 DllImport 调用 DLL 弹出的提示框哦! "," 挑战杯 ",0x30);
6.
(二)
动态装载、调用 DLL 中的非托管函数

在上面已经说明了如何用DllImport 调用DLL 中的非托管函数,但是这个是全局的函数,假若DLL
中的非托管函数有一个静态变量S,每次调用这个函数的时候,静态变量S 就自动加1。结果,当
需要重新计数时,就不能得出想要的结果。下面将用例子说明:
1.
1)
2)
3)
4)
启动Visual C++ 6.0;
// 导出函数,使用“ _stdcall ” 标准调用
extern "C" _declspec(dllexport)int _stdcall count(int init);
return S;
}
5)
2.
用 DllImport 调用DLL 中的count 函数
1)
2)
打开项目“Tzb”,向“Form1”窗体中添加一个按钮。
改变按钮的属性:Name 为 “B2”,Text 为 “用 DllImport 调用DLL 中 count 函数”,
并将按钮B1 调整到适当大小,移到适当位置。
打开“Form1.cs”代码视图,使用关键字 static 和 extern 声明方法“count”,并使其
3)
具有来自 Count.dll 的导出函数count 的实现,代码如下:

[DllImport("Count.dll")]
static extern int count(int init);
4)
MessageBox.Show(" 用 DllImport 调用 DLL 中的 count 函数, \n 传入的实参为 10 ,得到的结果是:
"+count(10).ToString()+"\n 结果可不是想要的 11 哦!!! "," 挑战杯 ");
MessageBox.Show(" 所得结果表明: \n 用 DllImport 调用 DLL 中的非托管 \n 函数是全局的、静态的函数!!! "," 挑
战杯 ");
5)
把 Count.dll 复制到项目“Tzb”的 bin\Debug 文件夹中,按“F5”运行该程序,并点击按钮
B2,便弹出如下三个提示框:
剩余23页未读,继续阅读
资源评论

美丽的格桑花888
- 粉丝: 1901
- 资源: 2425

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
