2

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

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

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

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

4

2 回答 2

0

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

于 2010-03-11T01:45:09.043 回答
0

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

如果您不想使用 AD,我能想到的一个帮助进程启动您的主进程并在 DLL 停止运行后删除它。

于 2010-03-11T01:45:25.297 回答