我创建了ac#.net(4.5)命令行应用程序.这个应用程序什么都不做,但保持开放:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("started");
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在资源管理器中导航到此文件,我可以在程序运行时使用F2重命名它.
如果我尝试删除它,将显示一条消息:

我可以理解,删除已加载的程序集是不可能的.将加载的程序集从一个文件夹移动到另一个文件夹也不起作用.
但为什么可以重命名呢?
这是有意的吗?是否有用例重命名现有/已加载的程序集?
文件由文件系统中的两个主要结构表示.首先是目录条目,它存储有关该文件的元数据.像文件名,大小,属性和时间戳.接下来是存储文件数据的集群链.
加载程序集会导致为程序集创建内存映射文件.优化,它确保您只需支付实际使用的组件部分.在实际需要之前,文件数据不会被读入RAM.需求分页虚拟内存操作系统(如Windows)的核心功能.
内存映射文件会锁定文件,以确保其他进程无法更改文件数据.这将是灾难性的,RAM中的数据将不再与文件中的数据匹配.Windows中的锁仅保护文件数据,而不保护文件的元数据.或者换句话说,您仍然可以修改文件的目录条目,只要它不会修改文件数据.
因此重命名文件不是问题,只修改目录条目.即使将文件从一个目录移动到另一个目录也不是问题,只需更改目录条目的位置,只要文件足够大以至于需要集群,它就不会修改文件数据.将文件从一个驱动器移动到另一个驱动器是一个问题,因为这需要一个也删除原始文件数据的副本.无法删除文件,这也会删除文件数据.