![]() |
1
63
首先,您需要了解两种截然不同的DLL之间的区别。Microsoft决定同时使用.NET(托管代码)和本机代码使用相同的文件扩展名(.exe和.dll),但是托管代码DLL和本机DLL是 非常 内部不同。
1)对于.NET,在执行第一个尝试从DLL访问任何内容的方法时,通常按需加载DLL。这就是为什么如果无法加载dll,则可以在代码中的任何位置获取typenotfoundexceptions。当像Word这样的东西突然开始大量访问HDD时,它很可能会进行交换(获取已交换到磁盘的数据,以便在RAM中腾出空间)。
1a)对于托管DLL,.NET框架是加载、JIT编译(将.NET字节码编译为本机代码)和链接DLL的工具。对于本机dll,它是加载和链接dll的操作系统组件(不需要编译,因为本机dll已经包含本机代码)。
1b)链接是指当调用代码中对dll中符号(例如方法)的引用(例如方法调用)替换为dll中事物的实际地址时。这是必要的,因为在将DLL加载到内存之前,无法知道它中事物的最终地址。
2)在Windows上,.exe文件和.dll文件完全相同。本机.exe和.dll文件包含本机代码(与处理器执行的代码相同),因此不需要翻译。托管.exe和.dll文件包含.NET字节码,该字节码是第一个JIT编译(转换为本机代码)的字节码。
2a)代码经过JIT编译后,以与任何代码完全相同的方式运行。
3)只要两个平台上的框架都是最新的,并且编写DLL的人没有故意使用本机调用破坏兼容性,托管DLL就可以按原样工作。由于格式不同(即使内部机器代码相同,如果它们都适用于同一处理器平台),本机DLL的工作方式与中不同。顺便说一下,在Linux上,“dlls”被称为.so(共享对象)文件。
4)托管DLL是.NET框架特有的,但它们自然可以与任何兼容语言一起工作。只要每个人都使用相同的约定(调用约定(如何在机器代码级别传递函数参数)、符号命名等),本机DLL就可以兼容。
5)托管DLL包含它们所包含的每个类、方法、字段等的完整描述。Afaik Delphi不支持.NET,因此它将创建本地DLL,而不能直接在.NET中使用。您可能可以使用PInvoke调用函数,但找不到类定义。我不使用delphi,所以我不知道它如何用dll存储类型信息。例如,C++依赖于包含类型声明的头(.h)文件,并且必须与DLL一起分发。
6)实际上,如果您可以轻松地切换DLL,就不难做到这一点。可以使用代码签名来避免这种情况。为了让某人替换签名的dll,他们必须知道签名密钥,而签名密钥是保密的。
6a)只要是用任何.NET语言生成的托管dll,它就可以工作。
“dll导入”可以有很多意思,通常是指引用一个dll文件并在其中使用它。 动态链接库注册是在Windows上完成的一项操作,它将动态链接库文件作为COM组件进行全局注册,使其可用于系统上的任何软件。 |
![]() |
2
7
.dll文件包含可在应用程序中使用的已编译代码。 有时用于编译.dll的工具很重要,有时不重要。如果您可以在项目中引用.dll,则使用哪个工具来编写.dll公开的函数并不重要。 链接发生在运行时,与静态链接库(如类)不同,静态链接库在编译时链接。 你可以把.dll看作一个黑盒子,它提供了你的应用程序不想自己写的东西。是的,理解.dll签名的人可以创建另一个.dll文件,其中包含不同的代码,而您的调用应用程序不知道两者的区别。 高温高压 |
![]() |
3
5
1)我认为您混淆了链接和加载。这个链接是当所有的检查和平衡都被测试,以确保所要求的是可用的。在加载时,部分DLL被加载到内存中或交换到页面文件中。这是您看到的高清活动。 动态链接不同于静态链接,在静态链接中,所有的对象代码都在链接时放入main.exe。通过动态链接,对象代码被放入一个单独的文件(dll)中,并在与.exe不同的时间加载。 动态链接可以是隐式的(即应用程序与导入库链接),也可以是显式的(即应用程序使用LoadLibrary(Ex)加载DLL)。 在隐式情况下,可以使用/delayload推迟加载dll,直到应用程序实际需要它为止。否则,作为进程初始化的一部分,至少要加载它的某些部分(映射到进程地址空间)。DLL也可以请求 它永远不会在进程处于活动状态时卸载。 COM使用LoadLibrary加载COM DLL。请注意,即使在隐式情况下,系统也在进程启动或首次使用时使用类似于loadlibrary的方法加载dll。
2)DLL包含与.exes类似的对象代码。dll文件的格式几乎与exe文件的格式相同。我听说这两个文件的头中只有一个位是不同的。 对于从C.NET构建的DLL,.NET框架正在运行它。
3)DLL是平台特定的。
4)如果特别注意或者编写了一些附加的粘合代码,则DLL可以与其他框架进行互操作。 当公司销售多个具有重叠功能的产品时,DLL非常有用。例如,我维护一个光栅I/O DLL,该DLL被公司30多个不同的产品使用。如果安装了多个产品,则一次DLL升级可以将所有产品升级为新的光栅格式。
5)根据平台的不同,动态链接库的功能以各种方式呈现,包括.h文件、.tlb文件或.net上的其他方式。
6)dumpbin/exports和dumbin/imports是用于.exe和.dlls的有趣工具。 |
|
Guilherme Albertini · DLL中的类 6 年前 |
![]() |
Naomi · C#dll资源文件更改语言 6 年前 |
![]() |
AidanH · C#DLL语言翻译实现[关闭] 6 年前 |
![]() |
subham · DLL函数调用不工作 6 年前 |
![]() |
PixelThis · 为什么我的DLL要求我的程序有一个特定的名称? 6 年前 |
![]() |
nemo · DLL的“好”调用约定是什么? 6 年前 |