什么时候加载dll:隐式链接VS显式链接

When do these load DLLs : Implicit Linking VS Explicit Linking

本文关键字:链接 VS 加载 dll 什么时候      更新时间:2023-10-16

我认为隐式链接在应用程序启动时加载DLL,因为它也被称为"加载时动态链接"。但是我从下面的链接(https://msdn.microsoft.com/en-us/library/253b8k2c(VS.80).aspx)中发现了一些奇怪的解释。

隐式链接

像程序的其他代码一样,DLL代码被映射到地址进程启动时的空间,它被加载到只在需要的时候记忆。因此,PRELOAD和LOADONCALL代码在以前版本中,.def文件用来控制加载的属性

显式链接

隐式链接到许多dll的应用程序可能很慢因为Windows在应用程序加载时加载所有dll。为了提高启动性能,应用程序可以隐式链接到加载后立即需要的dll,并显式地等待在需要时链接到其他dll。

关于隐式链接的另一个解释(https://msdn.microsoft.com/en-us/library/151kt790.aspx)。

隐式链接

Visual c++链接器现在支持延迟加载dll。这减轻了您使用Windows SDK函数LoadLibrary的需要和GetProcAddress实现DLL延迟加载。

在Visual c++ 6.0之前,在运行时加载DLL的唯一方法是使用LoadLibrary和GetProcAddress;操作系统将加载加载可执行文件或使用它的DLL时的DLL。

从Visual c++ 6.0开始,当与DLL进行静态链接时linker提供了延迟加载DLL直到程序调用的选项DLL中的一个函数。

应用程序可以使用/DELAYLOAD (delay load)来延迟加载DLL带有辅助函数(默认实现)的链接器选项由Visual c++提供)。helper函数将在运行时加载DLL为您调用LoadLibraryGetProcAddress

我真的很困惑,不知道如何理解这些。

1。隐式链接是否在启动时加载DLL或仅在调用DLL中的函数时加载?

2。这意味着两者在结束时是相似的,因为LoadLibrary()是在引擎盖下调用?

@remy-lebeau在他的评论中给出了很好的解释。我将在这里详细说明作为答案。

这里解释了隐式和显式dll加载之间的区别。总之:

  • 显式加载中,应用程序通过显式调用LoadLibrary来加载dll。
  • 隐式加载中,应用程序在编译时指定dll, Windows加载器在运行时加载它。

隐式加载有很多优点,但是它减慢了应用程序的加载时间,因为所有dll都是在这个阶段加载的。

为了解决这个问题,微软支持延迟加载dll,这是一种类型的隐式加载

通过使用它,你可以享受隐式加载的所有好处,但是只有当应用程序调用它的一个函数时,dll才会被加载。

回答你的问题:

  1. 在隐式加载中,如果没有指定延迟加载,dll将在应用程序启动时加载。如果你这样做了,它将在第一次使用时加载。
  2. 是的。在所有的场景中,dll都被加载并映射到应用程序内存。