在 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.
我有非常简单的 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.