c# - 为什么重命名加载的 .net 程序集有效?

标签 c# .net

我创建了一个 c# .net(4.5) 命令行应用程序。 此应用程序不执行任何操作,但保持打开状态:

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

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

如果我尝试删除它,会显示一条消息: enter image description here

我知道无法删除已加载的程序集。将加载的程序集从一个文件夹移动到另一个文件夹也不起作用。

但是为什么可以改名呢?

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

最佳答案

文件在文件系统中由两个主要结构表示。首先是目录条目,它存储有关文件的元数据。比如文件名、大小、属性和时间戳。接下来是存储文件数据的簇链。

加载程序集会导致为该程序集创建一个内存映射文件。一种优化,它确保您只为实际使用的装配部件付费。文件数据只有在实际需要时才会被读入 RAM。 Windows 等按需分页虚拟内存操作系统的核心功能。

内存映射文件锁定文件以确保文件数据不能被另一个进程更改。那将是灾难性的,RAM 中的数据将不再与文件中的数据匹配。 Windows 中的锁仅保护文件数据,而不保护文件的元数据。或者换句话说,您仍然可以修改文件的目录条目,只要不修改文件数据即可。

所以重命名文件不是问题,只是修改了目录条目。即使将文件从一个目录移动到另一个目录也不是问题,这只会改变目录条目的位置,只要文件大到需要簇就不会修改文件数据。将文件从一个驱动器移动到另一个驱动器是一个问题,因为这需要同时删除原始文件数据的副本。删除文件是不可能的,这也会删除文件数据。

关于c# - 为什么重命名加载的 .net 程序集有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14774099/

相关文章:

c# - 隐藏 DataGridViewImageColumn 中的图像

.net - 如何配置 OpenFileDialog 来选择文件夹?

c# - 从字符串加载图像

c# - MS Dynamics CRM 在线 2011 - 身份验证问题

c# - 什么是单元测试范围?

c# - c#中多重继承和接口(interface)的区别

c# - 如何从谷歌可视化中隐藏一列

.net - "Items collection cannot be modified when the DataSource property is set."无论如何?

.net - 是否存在指定的(子)索引分隔符?

c# - 为什么 DriveInfo.GetDrives() 无法在 Windows 服务中获取网络映射驱动器