Building Visual Studio project with different platforms via MSBuild

13,031

Solution 1

I found the solution for my problem. Use Choose element in *.csproj file for detect building via Visual Studio or via MSBuild and use Reference (instead of ProjectReference) for 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>

Solution 2

You can make this work if you define a custom build configurations in your solution file.

Open the solution in Visual Studio, then open Configuration Manager for the solution. In the Active solution platforms drop-down there will be <New...> option that would allow you to create x86 and x64 platforms for the solution. After you've created them select each one in that same drop-down and make sure that in the list you have Any CPU for your projects A and B and that the project C has correspondingly x86 or x64 selected. Also make sure that Build checkbox is checked.

Now switch the Active solution configuration to Release and define those extra platforms the same way.

After you do that you'll be able to build all 3 projects specifying just the solution file in the MSbuild command line:

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
Share:
13,031
Aleksandr Vishnyakov
Author by

Aleksandr Vishnyakov

Updated on June 19, 2022

Comments

  • Aleksandr Vishnyakov
    Aleksandr Vishnyakov almost 2 years

    I have 3 projects with configuration:

    • Project A: Debug|AnyCPU, Release|AnyCPU
    • Project B: Debug|AnyCPU, Release|AnyCPU
    • Project C: Debug|x86, Debug|x64, Release|x86, Release|x64

    Project C have B in dependencies and B have A in dependencies. (A <- B <- C)

    I use *.bat file to build its from command line:

    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
    

    And recieve error:

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(609,5): error : The OutputPath property is not set for project 'A.csproj'. Please check to make sure that you have specified a valid combination of Configuration and Platform for this project. Configuration='Debug' Platform='x86'. You may be seeing this message because you are trying to build a project without a solution file, and have specified a non-default Configuration or Platform that doesn't exist for this project. [A.csproj] C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(609,5): error : The OutputPath property is not set for project 'B.csproj'. Please check to make sure that you have specified a valid combination of Configuration and Platform for this project. Configuration='Debug' Platform='x86'. You may be seeing this message because you are trying to build a project without a solution file, and have specified a non-default Configuration or Platform that doesn't exist for this project. [B.csproj]