DLL 编译后的生命周期是多少?

Posted

技术标签:

【中文标题】DLL 编译后的生命周期是多少?【英文标题】:What's the lifetime of a DLL after being compiled? 【发布时间】:2019-12-09 17:39:46 【问题描述】:

我正在阅读它,关于记忆的部分真的很混乱。 DLL 编译后究竟发生了什么?

有些困扰我的问题:

它是否只加载到内存中一次,并且所有需要访问它的进程都只给出一个指向它所在位置的指针?

什么时候加载?我确信它不仅仅是在编译后任意加载到内存中,所以是否有一个特殊的程序来加载它,或者当一个进程需要它并保持它以在其他进程之间共享时,Windows 是否会加载一个 DLL?

来自微软文档

加载 DLL 的每个进程都将其映射到其虚拟地址空间。进程将DLL加载到它的虚拟地址后,就可以调用导出的DLL函数了。

这个“映射”是什么样子的?我发现这有点令人困惑。

我不知道这是否是相关信息,但我对自定义 DLL(我编写的 DLL)特别感兴趣,而不是系统 DLL

【问题讨论】:

最初发明 DLL 时,它们旨在在不同进程之间共享。我认为不再是这种情况了,但我不知道它更改了哪个版本的 Windows 或记录在哪里。 @MarkRansom 等等,现在不是这样了吗?那现在是什么情况?我在win10上。 我认为每个进程都会重新加载整个 DLL。但是我又不记得我是如何得到这个想法的,所以除非我或其他人可以用文档支持它,否则不要把它当作福音。 【参考方案1】:

一个 exe 文件lists DLLs is wants to link to,所以当加载器加载一个 exe 时,它​​会加载列出的所需 DLL,除非它们已经加载。 DLL 可能会在第一次加载时运行初始化代码。

当然,DLL 可以通过名称动态加载,然后在程序发出LoadLibrary API 调用时加载。这对于实现可动态加载的插件很有用。

Windows 为每个 DLL 保留一个引用计数器,因此当所有进程通过退出或显式调用 FreeLibrary 停止引用 DLL 时,Windows 将卸载 DLL,使其有机会运行任何清理代码。

【讨论】:

以上是关于DLL 编译后的生命周期是多少?的主要内容,如果未能解决你的问题,请参考以下文章

React+ANTD项目使用后的一些关于生命周期比较实用的心得

Maven -- 生命周期与插件

为什么生命周期名称显示为函数类型的一部分?

会话的默认生命周期是多少?

注销后的 CSRF 令牌生命周期

MarshalByRefObject 生命周期