Visual studio 通过MSBuild使用不同平台构建Visual Studio项目

Visual studio 通过MSBuild使用不同平台构建Visual Studio项目,visual-studio,msbuild,platform,Visual Studio,Msbuild,Platform,我有3个配置项目: 项目A:调试| AnyCPU,发布| AnyCPU 项目B:调试| AnyCPU,发布| AnyCPU 项目C:调试| x86,调试| x64,发布| x86,发布| x64 项目C在依赖项中有B,在依赖项中有A。(A如果在解决方案文件中定义自定义生成配置,则可以实现此功能 在Visual Studio中打开该解决方案,然后打开该解决方案的Configuration Manager。在“活动解决方案平台”下拉列表中,将有选项,允许您为该解决方案创建x86和x64平台。创建

我有3个配置项目:

  • 项目A:调试| AnyCPU,发布| AnyCPU
  • 项目B:调试| AnyCPU,发布| AnyCPU
  • 项目C:调试| x86,调试| x64,发布| x86,发布| x64

项目C在依赖项中有B,在依赖项中有A。(A如果在解决方案文件中定义自定义生成配置,则可以实现此功能

在Visual Studio中打开该解决方案,然后打开该解决方案的Configuration Manager。在“活动解决方案平台”下拉列表中,将有
选项,允许您为该解决方案创建x86和x64平台。创建完这些平台后,请在同一下拉列表中选择每个平台,并确保列表中有
项目A和B的任何CPU
,并且项目C相应地选择了x86或x64。还要确保选中了Build复选框

现在切换活动解决方案配置,以同样的方式发布和定义这些额外的平台

完成此操作后,您将能够在MSbuild命令行中仅指定解决方案文件来生成所有3个项目:

msbuild A.csproj /target:Build /property:Configuration=Debug;Platform=AnyCPU /verbosity:minimal
msbuild A.csproj /target:Build /property:Configuration=Release;Platform=AnyCPU /verbosity:minimal<br/>
msbuild B.csproj /target:Build /property:Configuration=Debug;Platform=AnyCPU /verbosity:minimal
msbuild B.csproj /target:Build /property:Configuration=Release;Platform=AnyCPU /verbosity:minimal
msbuild C.csproj /target:Build /property:Configuration=Debug;Platform=x86 /verbosity:minimal
msbuild C.csproj /target:Build /property:Configuration=Release;Platform=x86 /verbosity:minimal
msbuild C.csproj /target:Build /property:Configuration=Debug;Platform=x64 /verbosity:minimal
msbuild C.csproj /target:Build /property:Configuration=Release;Platform=x64 /verbosity:minimal
msbuild ABC.sln /target:Build /property:Configuration=Debug;Platform=x86 /verbosity:minimal
msbuild ABC.sln /target:Build /property:Configuration=Release;Platform=x86 /verbosity:minimal
msbuild ABC.sln /target:Build /property:Configuration=Debug;Platform=x64 /verbosity:minimal
msbuild ABC.sln /target:Build /property:Configuration=Release;Platform=x64 /verbosity:minimal

我找到了解决我问题的办法。 使用*.csproj文件中的Choose元素通过Visual Studio或MSBuild检测建筑,并使用引用(而不是ProjectReference)检测MSBuild

<Choose>
  <When Condition="'$(BuildingInsideVisualStudio)' == 'true'">
    <ItemGroup>
      <ProjectReference Include="A.csproj">
        <Project>{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}</Project>
        <Name>A</Name>
        <Private>True</Private>
      </ProjectReference>
      <ProjectReference Include="B.csproj">
        <Project>{BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB}</Project>
        <Name>B</Name>
        <Private>True</Private>
      </ProjectReference>
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <Reference Include="A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx, processorArchitecture=MSIL">
        <HintPath>A.dll</HintPath>
        <Private>True</Private>
      </Reference>
      <Reference Include="B, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx, processorArchitecture=MSIL">
        <HintPath>B.dll</HintPath>
        <Private>True</Private>
      </Reference>
    </ItemGroup>
  </Otherwise>
</Choose>

{aaaaaa-AAAA-AAAA-AAAA-aaaaaaaaaa}
A.
真的
{bbbbbbbbbb-BBBB-bbbbbb-BBBB-BBBBBBBB}
B
真的
动态链接库
真的
B.dll
真的

您可以尝试使用from命令行构建project。我想这不会有您遇到的问题,但我记得有关此构建选项的某些内容被弃用,有时会无故挂起。我将此作为一个选项编写,只是因为其他两个选项对我也不好。

.dll reference而不是projectreferece不好,我希望在每个生成上也生成依赖项。为主项目定义“Any CPU”也不好,因为它不是“Any CPU”,而是x86或x64。对我来说,这个问题并没有得到很好的解决。在正确完成之前,我将停止在我的项目中使用MSBuild。我想我也可以从命令行使用devenv.exe生成,但这是错误的虽然这是不推荐使用的,而且是有缺陷的,但devenv有时会挂起,直到无缘无故被杀死。