当它的所有者进程退出时,你如何让一个 DLL 被删除?

Posted

技术标签:

【中文标题】当它的所有者进程退出时,你如何让一个 DLL 被删除?【英文标题】:How can you get a DLL to be deleted when its owner process exits? 【发布时间】:2010-03-11 01:20:19 【问题描述】:

我有一个 .NET 程序集 DLL,它是从数据库中的预编译代码动态创建的。有没有办法创建DLL文件,将数据放入其中,用Assembly类加载它,然后当进程退出时,是否删除该DLL?

我的第一个想法是用FILE_SHARE_DELETE 标志打开它,用Assembly.LoadFrom, 加载它并自动删除它。

虽然 LoadLibrary 确实打开带有FILE_SHARE_DELETE 标志的文件,但当 DLL 仍在内存中映射时,操作系统不会删除该文件。

那么,如何在进程退出时删除 DLL,而不使用AppDomains 或启动外部“目标进程退出后删除此文件”可执行文件(在运行时加载的 .NET DLL 取决于用户输入,所以这样做会涉及某种进程通信,我想避免)。

【问题讨论】:

【参考方案1】:

不,这行不通。 CLR 在 DLL 上创建一个内存映射文件视图,在该视图被销毁之前不能删除它。在卸载 AppDomain 之前不会发生这种情况。由于您可能将其加载到主 AD 中,因此在程序停止运行之前不会发生这种情况。

如果您不想使用 AD,我能想到的就是启动您的主进程并在 DLL 停止运行后删除 DLL 的所有辅助进程。

【讨论】:

【参考方案2】:

如果您跟踪程序集的编译和保存位置,您可以在该位置使用File.Delete(位于 System.IO 中)

【讨论】:

以上是关于当它的所有者进程退出时,你如何让一个 DLL 被删除?的主要内容,如果未能解决你的问题,请参考以下文章

进程同步机制

进程同步机制

Nodejs 信号

主线程创建了子线程,怎么让主线程退出,而子线程仍然运行

当它也是一个弹性容器时,如何防止最后一个弹性项目填充剩余宽度[重复]

C# 开发的程序 如何 不让 使用者 看到 程序使用了啥dll