当它的所有者进程退出时,你如何让一个 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 被删除?的主要内容,如果未能解决你的问题,请参考以下文章