在 FreeLibrary 之后从磁盘中删除 C++/clr dll

Remove C++/clr dll from disk after FreeLibrary

我有非常简单的 exe 和 dll 只是为了测试。这是exe进程中的代码:

auto lib = ::LoadLibrary("CppDll.dll");
auto bar = (Bar)::GetProcAddress(lib, "Bar");
bar();
while (::FreeLibrary(lib));

在此之后我尝试删除 dll 文件时,我看到以下内容:

我也研究了模块,我很困惑

auto lib = ::LoadLibrary("CppDll.dll");
auto bar = (Bar)::GetProcAddress(lib, "Bar");

bar();

while (::FreeLibrary(lib));

所以在调用 bar() 之后有两个。在 FreeLibrary 之后,还有一个。

如何删除文件?

UPD:我刚刚发现只有当 dll 支持 clr 时才会发生这种情况。

这似乎是不可能的。托管 CLR 的应用程序使用 CLRCreateInstance,它可以从中获取 ICLRMetaHost 接口,在该接口上可以调用 GetRuntime 以创建 CLR。但是该接口没有卸载 CLR 的成员。它的 Stop 方法会停止 CLR 中的代码执行,但不会释放、资源或卸载应用程序域。但是要卸载程序集,我们必须卸载所有使用它的应用程序域。

因此,为了能够卸载程序集,需要将其加载到单独的应用程序域中,然后卸载该应用程序域。但是无法卸载加载CLR的DLL,只能在进程退出的时候卸载CLR

Richter,通过 C# 实现 CLR。第 22 章“CLR 托管和 AppDomains”:

The first AppDomain created when the CLR is initialized is called the default AppDomain; this AppDomain is destroyed only when the Windows process terminates.