4

我有 3 个配置项目:

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

项目 C 在依赖项中有 B,而 B 在依赖项中有 A。(A <- B <- C)

我使用 *.bat 文件从命令行构建它:

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

并收到错误:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(609,5):错误:未为项目“A.csproj”设置 OutputPath 属性。请检查以确保您为此项目指定了有效的配置和平台组合。配置='调试'平台='x86'。您可能会看到此消息,因为您正在尝试构建没有解决方案文件的项目,并且指定了该项目不存在的非默认配置或平台。[A.csproj] C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(609,5):错误:未为项目“B.csproj”设置 OutputPath 属性。请检查以确保您为此项目指定了有效的配置和平台组合。配置='调试' 平台='x86'。您可能会看到此消息,因为您正在尝试构建没有解决方案文件的项目,并且指定了该项目不存在的非默认配置或平台。[B.csproj]

4

3 回答 3

5

我找到了解决我的问题的方法。使用 *.csproj 文件中的选择元素通过 Visual Studio 或通过 MSBuild 检测构建,并为 MSBuild 使用 Reference(而不是 ProjectReference)。

<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>
于 2012-09-11T14:13:16.310 回答
3

如果您在解决方案文件中定义自定义构建配置,则可以完成这项工作。

在 Visual Studio 中打开解决方案,然后打开解决方案的配置管理器。在活动解决方案平台下拉列表中,将有一个<New...>选项允许您为解决方案创建 x86 和 x64 平台。创建它们后,在同一个下拉列表中选择每一个,并确保在列表中您Any CPU的项目 A 和 B 以及项目 C 已相应选择 x86 或 x64。还要确保选中 Build 复选框。

现在将活动解决方案配置切换到发布,并以相同的方式定义这些额外的平台。

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

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
于 2012-09-10T20:35:41.697 回答
0

您可以尝试从命令行使用devenv.exe构建项目。我认为这不会有您遇到的问题,但我记得有关此构建选项的一些内容将被弃用,并且有时会无缘无故地挂起。我把它写成一个选项,只是因为其他两个对我也不好。

于 2015-03-09T07:25:24.637 回答