这些何时加载 DLL:隐式链接 VS 显式链接

2023-11-26

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

隐式链接

与程序代码的其余部分一样,DLL 代码也被映射到地址 进程启动并加载时的进程空间 仅在需要时才记忆。因此,PRELOAD 和 LOADONCALL 代码 .def 文件使用的属性来控制以前版本中的加载 Windows 不再具有意义。

显式链接

隐式链接到许多 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 时, 链接器提供延迟加载 DLL 直到程序调用的选项 该 DLL 中的函数。

应用程序可以使用/DELAYLOAD(延迟加载 导入)带有辅助函数的链接器选项(默认实现 由 Visual C++ 提供)。辅助函数将在运行时加载 DLL 打电话的时间加载库 and 获取进程地址为你。

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

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

2. 这意味着两者最终是相似的,因为 LoadLibrary() 是在后台调用的?


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

隐式和显式dll加载之间的区别解释here。 简而言之:

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

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

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

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

对于您的问题:

  1. 在隐式加载中,如果您没有将其指定为延迟加载,则 dll 将在应用程序启动时加载。如果您这样做了,它将在第一次使用时加载。
  2. 是的。在所有情况下,dll 都会被加载并映射到应用程序内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这些何时加载 DLL:隐式链接 VS 显式链接 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐