Como especifico a plataforma para o MSBuild?

155

Estou tentando usar o MSBuild para criar uma solução com uma plataforma de destino especificada (preciso de binários, x86 e x64). Foi assim que tentei:

C:\WINDOWS\Microsoft.NET\Framework\v3.5>MsBuild SolutionPath\Solution.sln /t:Rebuild /p:Configuration=Release /p:Platform="x86"

No entanto, a construção sempre falha se a plataforma for diferente de "Qualquer CPU". O que estou fazendo de errado?

Este é o momento em que o MSBuild imprime:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: Reconstruir / p: Configuração = Release / p: Platform = "x86" Versão do Microsoft Build Engine 3.5.30729.1 [ Microsoft .NET Framework, versão 2.0.50727.3082] Copyright (C) Microsoft Corporation 2007. Todos os direitos reservados.

Compilação iniciada em 1.7.2010 8:28:10. Projeto "SolutionPath \ Solution.sln" no nó 0 (reconstruir as tarifas t). SolutionPath \ Solution.sln: erro MSB4126: A configuração da solução especificada "Release | x86" é inválida. Especifique uma configuração de solução válida usando as propriedades de Configuração e plataforma (por exemplo, MSBuild.exe Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") ou deixe essas propriedades em branco para usar a configuração padrão da solução. Projeto de construção concluído "SolutionPath \ Solution.sln" (reconstruir o (s) alvo (s)) - FAILED.

Falha na construção.

"SolutionPath \ Solution.sln" (destino de reconstrução) (1) -> (destino ValidateSolutionConfiguration) -> SolutionPath \ Solution.sln: erro MSB4126: A configuração de solução especificada "Release | x86" é inválida. Especifique uma configuração de solução válida usando as propriedades de Configuração e plataforma (por exemplo, MSBuild.ex e Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") ou deixe essas propriedades em branco para usar a configuração padrão da solução.

0 Warning(s)
1 Error(s)

Tempo decorrido 00: 00: 00.03

Se eu tentar compilar para x86 / x64 com o devenv, ele funcionará perfeitamente, no entanto, estou tentando configurar um servidor de compilação sem instalar todas as versões necessárias do Visual Studio. A propósito, se houver uma ferramenta gratuita melhor (que suporte o .NET framework 4) por aí, eu adoraria ouvir sobre isso.

David Božjak
fonte
1
Como isso falha? Talvez alguns projetos não suportem a plataforma x86?
Brian
3
Tem certeza de que não precisa de / p: Platform = "Win32"?
Andrew Wyatt
Para futuros leitores chegando aqui e imaginando como instalar a versão 2017 do MSBuild em uma máquina sem instalar o Visual Studio, consulte esta outra pergunta .
Wai Ha Lee
@AndrewWyatt - afaik - C ++ usa Win32enquanto moden.NET usax86
Elliot Woods
@ ElliotWoods - obrigado pelo esclarecimento sobre re: Win32 / x86 - minha opinião seria apenas do ponto de vista de C ++.
Andrew Wyatt

Respostas:

106

Se você deseja criar sua solução para x86 e x64 , sua solução deve ser configurada para ambas as plataformas. Na verdade, você apenas tem uma configuração Qualquer CPU .

Como verificar a configuração disponível para um projeto

Para verificar a configuração disponível para um determinado projeto, abra o arquivo do projeto ( *.csprojpor exemplo) e procure por um PropertyGroupcom o direito Condition.

Se você deseja criar o Releasemodo para x86, deve ter algo parecido com isto no seu arquivo de projeto:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
  ...
</PropertyGroup>

Como criar e editar a configuração no Visual Studio

Painel do Gerenciador de Configurações
(fonte: microsoft.com )

Novo botão da plataforma de solução
(fonte: msdn.com )

Novo painel da plataforma de solução
(fonte: msdn.com )

Como criar e editar a configuração (no MSDN)

Julien Hoarau
fonte
Qual é a diferença no uso de x86 ou x64?
Acaz Souza
2
x86 cria dll de 32 bits / executável e x64 cria dlls de 64 bits / executável.
Benjamin Baumann
@Julien posso / devo usar o arquivo .targets para definir configurações compartilhadas?
Jan 'splite' K.
4
Alguns projetos usam, em Win32vez de, x86por exemplo, os CMakegerados libssh2usam ( usos CMake).
Jeroen Wiert Pluimers
211

No MSBuild ou Teamcity, use a linha de comando

MSBuild yourproject.sln /property:Configuration=Release /property:Platform=x64

ou use uma forma mais curta:

MSBuild yourproject.sln /p:Configuration=Release /p:Platform=x64

No entanto, você precisa configurar a plataforma em seu projeto, veja a resposta de Julien Hoarau.

Tomas Kubes
fonte
não realizou a sub-configuração para / property para identificar a configuração e a plataforma. Obrigado
DRapp 31/03/16
7
Cuidado que o MSBuild não considera o Visual Studio "Configurações da solução", mas define as propriedades antes de executar o xxproj para cada projeto da solução. A plataforma e a configuração serão as mesmas para cada projeto da solução, independentemente da combinação de configurações de projeto que você selecionou no Visual Studio.
Laurent LA RIZZA
2
Ou possivelmente mais curto: / p: Configuration = Release; AnyOtherParameter = Abc123; Platform = x86
granadaCoder
1
Se isso ajudar alguém, um argumento com várias palavras na linha de comando é colocado entre aspas duplas. Então Platform="Any CPU"ou Platform="Mixed Platforms"para quem precisa.
John Doe
14

Se você estiver tentando fazer isso na linha de comando, poderá encontrar um problema em que uma variável de ambiente 'Platform' em toda a máquina está sendo configurada para você e trabalhando contra você. Eu posso reproduzir isso se eu usar a janela de comando do VS2012 em vez de uma janela de comando normal do Windows.

No prompt de comando, digite:

definir plataforma

Em uma janela de comando do VS2012, tenho um valor predefinido de 'X64'. Isso parece interferir no que estiver no meu arquivo de solução.

Em uma janela de comando comum, o comando 'set' resulta em uma mensagem "variável não definida" ... o que é bom.

Se o resultado do seu comando 'set' acima não retornar nenhum valor de variável de ambiente, você deve estar pronto.

JJMpls
fonte
2
Obviamente, é assim que uma janela de comando do VS2012 x64 é diferenciada de uma janela de comando do VS2012 x86. IOW, pelo projeto, não "interferência"
MSalters
0

Para o VS2017 e 2019 ... com os modernos arquivos de projeto SDK da biblioteca principal , a plataforma pode ser alterada durante o processo de criação. Aqui está um exemplo para mudar para a anycpuplataforma, pouco antes da CoreCompiletarefa interna ser executada:

<Project Sdk="Microsoft.NET.Sdk" >

  <Target Name="SwitchToAnyCpu" BeforeTargets="CoreCompile" >
    <Message Text="Current Platform=$(Platform)" />
    <Message Text="Current PlatformTarget=$(PlatformName)" />
    <PropertyGroup>
      <Platform>anycpu</Platform>
      <PlatformTarget>anycpu</PlatformTarget>
    </PropertyGroup>
    <Message Text="New Platform=$(Platform)" />
    <Message Text="New PlatformTarget=$(PlatformTarget)" />
  </Target>

</Project>

No meu caso, estou criando um FPGA com BeforeTargetse AfterTargetstarefas, mas compilando um aplicativo C # principalmente CoreCompile. (em parte porque eu quero algum tipo de aplicativo de linha de comando e em parte porque não consegui descobrir como omitir ou substituir CoreCompile)

Para construir para vários binários, em simultâneo, como x86 e x64: qualquer um, a tarefa de compilação manual separado seria necessária ou dois arquivos de projeto em separado com o respectivo <PlatformTarget>x86</PlatformTarget>e <PlatformTarget>x64</PlatformTarget>configurações no exemplo acima.

gojimmypi
fonte