在Windows系统中,我们经常接触各种 .dll
文件,无论是在使用类库、调用系统 API,还是在安全研究、逆向分析中,DLL 都是一个不可绕过的重要组成部分。本文将系统性地展开分析这些基础知识,彻底搞清楚 DLL 背后的真实面貌。
01. NET DLL背景
最近有朋友问我这样一个问题:.NET 程序集和 C++ 写的 DLL 是一样的吗?虽然后缀名都是 .dll
,它们有什么本质不同?
这个问题看似简单,实则涉及多个知识层面:托管与非托管、程序集结构、反射机制、运行时加载方式等等。
1.1 什么是 DLL?
DLL,全称 Dynamic Link Library(动态链接库),最早用于 C/C++ 程序在运行时动态调用外部代码模块。其作用是将常用功能封装成独立的模块,便于程序之间共享和重用。
在 .NET 世界中,.dll
不再是单纯的机器码库,而是可以包含 托管代码和元数据 的 .NET 程序集(Assembly)。
通俗的说我们编写的C#代码只能在.NET运行时中执行,经过编译会生成 .dll 或 .exe 文件,这些文件必须在.NET运行时下执行的代码称为托管代码,包含这些托管代码的二进制单元就是 .NET 的Assembly