关于程序集,.NET 应该使用类似的方式打开程序集FileShare.ReadWrite
,即使它已加载到域中,任何其他进程都可以写入或重命名整个文件。
AFAIK,.NET 没有FileShare
用于允许或禁止重命名文件共享的托管枚举值(类似于FileShare.Rename
),但 Win32 应该具有因此程序集加载将创建带有掩码的文件流FileShare.ReadWrite | FileShare.Rename
(FileShare.Delete
包括重命名但也删除整个文件...)。
为了证明这一点,我尝试了以下代码:
FileStream a = File.Open(@"C:\blah.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
a.Dispose();
在打开文件流并处理它之前,我无法删除整个文件,但我可以重命名它。
请注意,程序集会AppDomain
在需要时加载到其中,这意味着您可能可以编写、删除或重命名程序集,因为它尚未加载。
尝试删除已经加载到的程序集AppDomain
:你不能(我刚刚尝试过,测试代码在控制台应用程序中运行,我无法在运行时删除可执行文件)。现在尝试重命名它:它可以工作。
概括
这完全是关于如何打开文件以及打开文件流时使用了哪个文件掩码配置:这就是为什么您的文件无法重命名但您可以重命名已加载的程序集的原因。
像下一个一样修改您的代码,您将能够重命名整个文件(甚至删除它!):
FileStream fileStream = File.Open(@"C:\temp\test1.txt", FileMode.Open, FileShare.ReadWrite | FileShare.Delete);
Console.ReadLine();