msbuild /p:Configuration=Release /t:Rebuild MySolution.sln
在 ILDasm 中,我只看到了元数据中的一些细微差异。转储并比较树视图没有发现差异。转储并比较标头则提供了一个线索:
Visual Studio Output MSBuild Output
// Size of init.data: 0x00000800 // Size of init.data: 0x00002000
// Size of headers: 0x00000200 // Size of headers: 0x00001000
// File alignment: 0x00000200 // File alignment: 0x00001000
初始化数据大小的差异为0x1800,即6144字节。头部大小的差异为0xE00,即3584字节。这两个差异之和为9728字节,这解释了差异。文件对齐方式的差异为3584字节。
往下看到:
Visual Studio Output MSBuild Output
// File size : 18944 // File size : 28672
// PE header size : 512 (496 used) ( 2.70%) // PE header size : 4096 (496 used) (14.29%)
// Data : 2048 (10.81%) // Data : 8192 (28.57%)
显然,这一切都归结于文件对齐。但是为什么在命令行构建时文件对齐方式会不同呢?在Visual Studio的高级设置中,我看到文件对齐方式确实设置为512:
该属性在项目文件中表现为一个PropertyGroup
:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
...
<FileAlignment>512</FileAlignment>
</PropertyGroup>
但是请注意$Configuration
和$Platform
的组合?出于一时兴起,我在命令行中尝试了以下内容:
msbuild /p:Configuration=Release /p:Platform="Any CPU" /t:Rebuild MySolution.sln
然后输出结果完美匹配(大小相同)!
这是发布配置的唯一属性组,因此无论是否指定平台,MSBuild显然都在使用它。为了证明这一点,我更改了此属性组中的OutputPath
,然后在命令行上使用MSBuild进行构建。果然,它选择了新的输出目录。
我尝试将512的对齐方式更改为1024,然后在命令行上构建。它使用了它!
为什么必须明确指定平台才能使MSBuild获取512字节的文件对齐方式?
FileAlignment
属性添加到通用属性组中,而我的错误项目文件将其放在Release|Any CPU组中。我认为可能发生的情况是升级时完全省略了它,而VS默认为256,而MSBuild默认为8192。然后当我在VS中编辑设置时,它决定将其添加到Release|Any CPU组中,因为它不在通用组中。如果我有机会,明天可能会测试这个理论。 - Kent Boogaartx.zzproj
文件的选项)可能更容易,特别是在多个配置中进行100%一致的更改。或者进行IDE不直接允许的更改(在解决方案文件夹中引用多个项目的x.sn
文件)。 - Richard