为什么重命名加载的.net程序集工作?

Man*_*uel 1 .net c#

我创建了ac#.net(4.5)命令行应用程序.这个应用程序什么都不做,但保持开放:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("started");
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在资源管理器中导航到此文件,我可以在程序运行时使用F2重命名它.

如果我尝试删除它,将显示一条消息: 在此输入图像描述

我可以理解,删除已加载的程序集是不可能的.将加载的程序集从一个文件夹移动到另一个文件夹也不起作用.

但为什么可以重命名呢?

这是有意的吗?是否有用例重命名现有/已加载的程序集?

Han*_*ant 8

文件由文件系统中的两个主要结构表示.首先是目录条目,它存储有关该文件的元数据.像文件名,大小,属性和时间戳.接下来是存储文件数据的集群链.

加载程序集会导致为程序集创建内存映射文件.优化,它确保您只需支付实际使用的组件部分.在实际需要之前,文件数据不会被读入RAM.需求分页虚拟内存操作系统(如Windows)的核心功能.

内存映射文件会锁定文件,以确保其他进程无法更改文件数据.这将是灾难性的,RAM中的数据将不再与文件中的数据匹配.Windows中的锁仅保护文件数据,而不保护文件的元数据.或者换句话说,您仍然可以修改文件的目录条目,只要它不会修改文件数据.

因此重命名文件不是问题,只修改目录条目.即使将文件从一个目录移动到另一个目录也不是问题,只需更改目录条目的位置,只要文件足够大以至于需要集群,它就不会修改文件数据.将文件从一个驱动器移动到另一个驱动器是一个问题,因为这需要一个也删除原始文件数据的副本.无法删除文件,这也会删除文件数据.