为什么我会选择除512以外的C#编译器文件对齐设置?

J M*_*J M 42 c# compiler-construction csc

我可以在MSDN中看到如何更改C#编译的文件对齐方式(通过项目设置和命令行).

我用谷歌搜索并看到文章解释512字节的文件对齐减少了.dll的大小.我已经使用不同的文件对齐测试了自己,并且看到了,是的,确实如此.

我的问题是:

为什么我要使用不同的文件对齐?必须有这样的场景,或者没有选项吗?

此外,它究竟做了什么?MSDN页面谈论部分?什么是部分?

http://msdn.microsoft.com/en-us/library/0s4tzdf2.aspx

UPDATE

在我自己的调查中,我有谷歌"C#文件对齐",".net汇编文件对齐"等,并最终找到:

https://msdn.microsoft.com/en-us/magazine/bb985992.aspx

它是从2002年开始的,所以我不知道它会有多大帮助.如果有人能让我知道我应该谷歌搜索......

Han*_*ant 68

这是一个相当技术性的实现细节.首先,您首先必须了解PE32文件的结构,即Windows中DLL和EXE的文件格式.规范性文章是Matt Pietrik的"PE内部对等,Win32可移植可执行文件格式之旅".写于17年前,但仍然相关和可用.

/ filealign设置是指IMAGE_OPTIONAL_HEADER.FileAlignment字段的值.它确定了节中原始数据的对齐方式.部分是文件中的一大块代码或数据.在纯.NET程序集的情况下几乎完全是数据.

文件格式与磁盘之间存在非常密切的关系.可执行映像用作Windows中内存映射文件的后备文件.通过将文件映射到虚拟内存地址空间来加载可执行文件.非常有效,加载DLL只涉及创建该映射,不从文件中读取实际数据.当进程尝试从节中读取一个字节时,这会以一种懒惰的方式发生.如果它尚未加载到内存中,则会产生页面错误,操作系统会从文件中读取4096个字节到内存中.最大的优点是您不需要为不使用的数据或代码付费.当你第一次阅读时,阅读[属性]的费用也很昂贵.

文件对齐的相关性是这些部分中的原始数据如何排列.包含机器代码的大多数现代可执行文件使用4096字节的对齐方式,即虚拟内存页面的大小.这与包含托管代码的程序集不太相关,IL只是数据.使用较小的对齐方式会更有意义,这种方式会浪费更少的空间.512字节(不是千字节)是一个幸福的数字,它是PE32格式允许的最小值.

我可以想到将选项添加到UI的唯一可能原因是C#编译器与其他编译器相比只有很少的编译选项."其他"是生成本机代码的编译器.所以选项就在那里,因为编译器有选项.[属性]涵盖了很多调整,很好地使编译器命令行简短而快速.但是没有文件对齐的属性,在生成文件之前需要知道,属性为时已晚.

相反的例子是C++编译器和链接器,IDE提供了19个属性页来设置它们.但仍然没有全部覆盖它们,必须在"命令行"选项页面中设置真正模糊的.