代码之家  ›  专栏  ›  技术社区  ›  Kent Boogaart

为什么msbuild需要显式设置目标平台?

  •  3
  • Kent Boogaart  · 技术社区  · 15 年前

    对于我的一个简单项目,Visual Studio中的一个版本生成了一个大小为18944字节的程序集。但是,如果我使用msbuild从命令行构建相同的解决方案,我会得到一个大小为28672字节的程序集。这是9728字节的差异。

    我正在使用以下命令调用msbuild:

    msbuild/p:configuration=release/t:rebuild mysolution.sln
    < /代码> 
    
    

    在ILDASM中,我只看到元数据中的细微差别。转储和比较树视图没有显示任何差异。转储和比较头产生了一个线索:

    Visual Studio输出msbuild输出
    //init.data的大小:0x00000800//init.data的大小:0x000002000
    //头大小:0x00000200//头大小:0x000001000
    //文件对齐方式:0x00000200//文件对齐方式:0x000001000
    < /代码> 
    
    

    init数据大小的差异为0x1800或6144字节。头大小的差异为0xe00或3584字节。这两个差异的总和是9728字节,这说明了差异。文件对齐的差异为3584字节。

    再往下看,我看到:

    Visual Studio输出msbuild输出
    //文件大小:18944//文件大小:28672
    //PE头大小:512(使用496)(2.70%)//PE头大小:4096(使用496)(14.29%)
    //数据:2048(10.81%)//数据:8192(28.57%)
    < /代码> 
    
    

    很明显,这都归结为文件对齐。但是,为什么在从命令行生成文件时文件对齐会有所不同?在Visual Studio的高级设置中,我看到文件对齐确实设置为512:。

    此属性显示在项目文件中的propertygroup:。

    <propertygroup condition=“'$(configuration)$(platform)='release anycpu'”>
    …
    <fileAlignment>512</fileAlignment>
    </propertygroup>
    < /代码> 
    
    

    但请注意configurationplatform?凭直觉,我从命令行尝试了这个:

    msbuild/p:configuration=release/p:platform=“any cpu”/t:rebuild mysolution.sln
    < /代码> 
    
    

    然后输出完全匹配(大小)!

    这是发布配置的唯一属性组,因此无论是否指定平台,msbuild显然都在使用它。为了证明这一点,我更改了此属性组中的outputpath,然后在命令行使用msbuild生成。果然,它找到了新的输出目录。

    我尝试将512的对齐方式改为1024,然后在命令行中构建。它用过了!

    为什么需要显式指定平台,以便msbuild获取512字节的文件对齐?

    我正在使用以下命令调用msbuild:

    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
    

    init数据大小的差异为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:

    alt text

    此属性显示在项目文件中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字节的文件对齐?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Richard    15 年前

    为什么需要明确指定平台

    因为默认值可能是 Debug|AnyCPU . 检查第一 <PropertyGroup> 在项目文件中,它应该包含接近以下内容的内容:

    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
    

    如果 Configuration Platform 未在命令行上设置。第一个组也可能正在设置默认的文件对齐方式。

        2
  •  2
  •   Kent Boogaart    15 年前

    通过查看我的项目文件的历史,我注意到没有 FileAlignment 属性,直到我在Visual Studio中显式设置它(我是在捏造问题时设置的)。项目文件已经从vs2008升级到vs2010(我认为在那之前vs2005升级到vs2008),所以我假设在这个过程中发生了一些问题。

    所以,至少现在,我把这归结为一个失败的升级和我在写问题的时候困惑自己的组合。我仍然不能很好地解释我所看到的行为(根据我的帖子),但自从 文件对齐 已显式添加。