![]() |
1
11
不。
从loadLibrary()文档:
|
![]() |
2
3
在这种情况下,您会有一个手柄泄漏:
正在卸载的模块不会隐式执行任何代码,以卸载它加载的模块。 由于没有执行任何代码来减少引用计数,因此模块B将永远不会被卸载。 以下是加载/卸载DLL的规则:
仍在内存中vs仍在加载: 当引用达到0时,不能保证您的模块在某个时间从内存中释放。但您应该将模块视为在引用计数达到0时卸载。 正在停止卸载dll: 要强制卸载dll,可以尝试
编辑: 您提到过您的目标是将代码喷射到正在运行的程序中,并且您希望故意泄漏句柄。 这很好,但是如果您经常运行这个操作,可能会导致源程序崩溃,因为会使用太多的句柄,或者最终会使用太多的内存。 您可以从dllmain返回false以阻止加载它,这样就不会浪费内存。当fdwareson为dll_process_attach时,可以执行此操作。你可以 read more about it here . 如果您试图模拟一个dll并添加您自己的额外功能,您将需要实现源dll实现的所有功能,并将每个调用委托回源dll。 |
![]() |
3
1
阅读 评论 详细解释。 需要注意的关键是:
再往下走
从 MSDN :
|
![]() |
4
1
Windows中的DLL被引用计数。卸载A时,您正在减少A上的引用计数,如果它达到零,则将卸载它,并且(假定代码中没有错误)将减少B上的引用计数。如果B上的引用计数变为零,则将卸载它。DLL C可能在B上有refcount,卸载A将不会卸载B。 |
|
Guilherme Albertini · DLL中的类 7 年前 |
![]() |
Naomi · C#dll资源文件更改语言 7 年前 |
![]() |
AidanH · C#DLL语言翻译实现[关闭] 7 年前 |
![]() |
subham · DLL函数调用不工作 7 年前 |
![]() |
PixelThis · 为什么我的DLL要求我的程序有一个特定的名称? 7 年前 |
![]() |
nemo · DLL的“好”调用约定是什么? 7 年前 |