我创建了一个 c# .net(4.5) 命令行应用程序。 此应用程序不执行任何操作,但保持打开状态:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("started");
Console.ReadLine();
}
}
如果我在资源管理器中导航到这个文件,我可以在程序运行时用 F2 重命名它。
如果我尝试删除它,会显示一条消息:
我知道无法删除已加载的程序集。将加载的程序集从一个文件夹移动到另一个文件夹也不起作用。
但是为什么可以改名呢?
这是故意的吗? 是否有重命名现有/加载程序集的用例?
最佳答案
文件在文件系统中由两个主要结构表示。首先是目录条目,它存储有关文件的元数据。比如文件名、大小、属性和时间戳。接下来是存储文件数据的簇链。
加载程序集会导致为该程序集创建一个内存映射文件。一种优化,它确保您只为实际使用的装配部件付费。文件数据只有在实际需要时才会被读入 RAM。 Windows 等按需分页虚拟内存操作系统的核心功能。
内存映射文件锁定文件以确保文件数据不能被另一个进程更改。那将是灾难性的,RAM 中的数据将不再与文件中的数据匹配。 Windows 中的锁仅保护文件数据,而不保护文件的元数据。或者换句话说,您仍然可以修改文件的目录条目,只要不修改文件数据即可。
所以重命名文件不是问题,只是修改了目录条目。即使将文件从一个目录移动到另一个目录也不是问题,这只会改变目录条目的位置,只要文件大到需要簇就不会修改文件数据。将文件从一个驱动器移动到另一个驱动器是一个问题,因为这需要同时删除原始文件数据的副本。删除文件是不可能的,这也会删除文件数据。
关于c# - 为什么重命名加载的 .net 程序集有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14774099/