我可以在 MS Docs 中看到如何更改 C# 编译的文件对齐方式(通过项目设置和命令行)。
我在 google 上搜索并看到文章解释 512 字节的文件对齐会减小 .dll 的大小。我用不同的文件对齐方式测试了自己,发现确实如此。
我的问题是:
为什么我想要使用不同的文件对齐方式?一定有一些场景需要这样做,否则就没有选择?
另外,它到底有什么作用? MSDN 页面谈论部分?什么是章节?
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/advanced#filealignment https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/advanced#filealignment
这是一个相当技术性的实现细节。首先,您必须了解 PE32 文件的结构,即 Windows 中 DLL 和 EXE 的文件格式。这方面的权威文章是 Matt Pietrik 的“Peering Inside the PE, A Tour of the Win32 Portable Executable File Format”。 17年前写的,但仍然有意义并可用 http://msdn.microsoft.com/en-us/library/ms809762.aspx.
/filealign 设置是指 IMAGE_OPTIONAL_HEADER.FileAlignment 字段的值。它决定了节中原始数据的对齐方式。节是文件中的一段代码或数据。在纯 .NET 程序集的情况下几乎都是数据。
文件格式与磁盘之间有着非常密切的关系。可执行映像用作 Windows 中内存映射文件的后备文件。通过将文件映射到虚拟内存地址空间来加载可执行文件。非常高效,加载 DLL 仅涉及创建该映射,而不从文件中读取实际数据。当进程尝试从节中读取字节时,这种情况会以惰性方式发生。如果尚未加载到内存中,则会产生页面错误,操作系统将从文件中读取 4096 字节到内存中。最大的优点是您无需为不使用的数据或代码付费。这也是第一次阅读[属性]时成本昂贵的原因。
文件对齐的相关性是各部分中的原始数据如何排列。大多数包含机器代码的现代可执行文件都使用 4096 字节的对齐方式,即虚拟内存页面的大小。这与包含托管代码的程序集关系不大,IL 只是数据。这使得使用较小的对齐方式是有意义的,这种对齐方式浪费的空间更少。 512 字节(不是千字节)是一个令人愉快的数字,它是 PE32 格式中允许的最小值。
我能想到的将选项添加到 UI 的唯一可能原因是,与其他编译器相比,C# 编译器的编译选项非常少。 “其他”是生成本机代码的编译器。所以这个选项就在那里,因为编译器有这个选项。 [属性] 涵盖了许多调整,很好地使编译器命令行变得简短而敏捷。但是文件对齐没有属性,需要在生成文件之前知道,属性就来不及了。
相反的例子是C++编译器和链接器,IDE提供nineteen属性页来设置它们。但还没有涵盖所有,真正晦涩难懂的还得在“命令行”选项页中设置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)