¿Cómo especifico la plataforma para MSBuild?

155

Estoy tratando de usar MSBuild para construir una solución con una plataforma de destino específica (necesito ambos binarios, x86 y x64). Así es como lo probé:

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

Sin embargo, la compilación siempre falla si la plataforma es diferente de "Cualquier CPU". ¿Qué estoy haciendo mal?

Esta es la salida impresa de MSBuild:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: Rebuild / p: Configuration = Release / p: Platform = "x86" Microsoft (R) Build Engine Versión 3.5.30729.1 [ Microsoft .NET Framework, Versión 2.0.50727.3082] Copyright (C) Microsoft Corporation 2007. Todos los derechos reservados.

La construcción comenzó el 1.7.2010 8:28:10. Proyecto "SolutionPath \ Solution.sln" en el nodo 0 (Reconstruir objetivo t (s)). SolutionPath \ Solution.sln: error MSB4126: La configuración de solución especificada "Release | x86" no es válida. Especifique una configuración de solución válida utilizando las propiedades de Configuración y Plataforma (por ejemplo, MSBuild.exe Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") o deje esas propiedades en blanco para usar la configuración de solución predeterminada. Proyecto de construcción finalizado "SolutionPath \ Solution.sln" (Reconstruir tget (s)) - FALLIDO.

Construcción fallida.

"SolutionPath \ Solution.sln" (Objetivo de reconstrucción) (1) -> (Objetivo ValidateSolutionConfiguration) -> SolutionPath \ Solution.sln: error MSB4126: La configuración de solución especificada "Release | x86" no es válida. Especifique una configuración de solución válida utilizando las propiedades de Configuración y Plataforma (p. Ej. MSBuild.ex e Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") o deje esas propiedades en blanco para usar la configuración de solución predeterminada.

0 Warning(s)
1 Error(s)

Tiempo transcurrido 00: 00: 00.03

Si intento compilarlo para x86 / x64 con devenv, funciona perfectamente, sin embargo, estoy tratando de configurar un servidor de compilación sin instalar todas las versiones necesarias de Visual Studio. Por cierto, si hay una mejor herramienta gratuita (que admite .NET Framework 4), me encantaría saberlo.

David Božjak
fuente
1
¿Cómo falla? ¿Quizás algunos proyectos no son compatibles con la plataforma x86?
Brian
3
¿Estás seguro de que no necesitas / p: Platform = "Win32"?
Andrew Wyatt
Para futuros lectores que lleguen y se pregunten cómo instalar la versión 2017 de MSBuild en una máquina sin instalar Visual Studio, vea esta otra pregunta .
Wai Ha Lee
@AndrewWyatt - afaik - C ++ usa Win32mientras que moden .NET usax86
Elliot Woods
@ElliotWoods - gracias por la aclaración re: Win32 / x86 - mi opinión solo habría sido desde el punto de vista de C ++.
Andrew Wyatt

Respuestas:

106

Si desea construir su solución para x86 y x64 , su solución debe estar configurada para ambas plataformas. En realidad solo tienes una configuración Any CPU .

Cómo verificar la configuración disponible para un proyecto

Para verificar la configuración disponible para un proyecto determinado, abra el archivo del proyecto ( *.csprojpor ejemplo) y busque un PropertyGroupa la derecha Condition.

Si desea construir en Releasemodo para x86, debe tener algo como esto en su archivo de proyecto:

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

Cómo crear y editar la configuración en Visual Studio

Panel de administrador de configuración
(fuente: microsoft.com )

Nuevo botón de plataforma de solución
(fuente: msdn.com )

Nuevo panel de plataforma de soluciones
(fuente: msdn.com )

Cómo crear y editar la configuración (en MSDN)

Julien Hoarau
fuente
¿Cuál es la diferencia en el uso de x86 o x64?
Acaz Souza
2
x86 construye dll / ejecutable de 32 bits y x64 construye dlls / ejecutable de 64 bits.
Benjamin Baumann
@Julien ¿puedo / debo usar el archivo .targets para configurar configuraciones compartidas?
Jan 'splite' K.
44
Algunos proyectos usan en Win32lugar de, x86por ejemplo, los CMakegenerados hacen ( libssh2usos CMake).
Jeroen Wiert Pluimers
211

En MSBuild o Teamcity, use la línea de comando

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

o use una forma más corta:

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

Sin embargo, de todos modos necesita configurar la plataforma en su proyecto, vea la respuesta de Julien Hoarau.

Tomás Kubes
fuente
no se dio cuenta de la configuración secundaria de / property para identificar tanto la configuración como la plataforma. Gracias
DRapp
77
Tenga en cuenta que MSBuild no considera las "configuraciones de solución" de Visual Studio, sino que establece las propiedades antes de ejecutar el xxproj para cada proyecto de la solución. La plataforma y la configuración serán las mismas para cada proyecto de la solución, sin importar qué combinación de configuraciones de proyecto haya seleccionado en Visual Studio.
Laurent LA RIZZA
2
O posiblemente más corto: / p: Configuration = Release; AnyOtherParameter = Abc123; Platform = x86
granadaCoder
1
Si ayuda a alguien, un argumento de varias palabras en la línea de comando se envuelve con comillas dobles. Entonces Platform="Any CPU"o Platform="Mixed Platforms"para aquellos que lo necesitan.
John Doe
14

Si está tratando de hacer esto desde la línea de comandos, es posible que se encuentre con un problema en el que se configura una variable de entorno de toda la máquina 'Plataforma' para usted y trabaja en su contra. Puedo reproducir esto si uso la ventana de comando VS2012 en lugar de una ventana de comando de Windows normal.

En el símbolo del sistema, escriba:

establecer plataforma

En una ventana de comando VS2012, tengo un valor de 'X64' preestablecido. Eso parece interferir con lo que sea que esté en mi archivo de solución.

En una ventana de comando normal, el comando 'set' da como resultado un mensaje de "variable no definida" ... lo cual es bueno.

Si el resultado de su comando 'set' anterior no devuelve ningún valor de variable de entorno, debería estar listo.

JJMpls
fuente
2
Por supuesto, así es como se diferencia una ventana de comando VS2012 x64 de una ventana de comando VS2012 x86. IOW, por diseño, no "interferencia"
MSalters
0

Para VS2017 y 2019 ... con los archivos de proyecto SDK de la biblioteca central moderna , la plataforma se puede cambiar durante el proceso de compilación. Aquí hay un ejemplo para cambiar a la anycpuplataforma, justo antes de que se CoreCompileejecute la tarea integrada :

<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>

En mi caso, estoy construyendo un FPGA con BeforeTargetsy AfterTargetstareas, pero compilando una aplicación C # en general CoreCompile. (en parte porque es posible que desee algún tipo de aplicación de línea de comandos, y en parte porque no pude descubrir cómo omitir o anular CoreCompile)

Para compilar para múltiples archivos binarios concurrentes, como x86 y x64: se necesitaría una tarea de compilación manual separada o dos archivos de proyecto separados con la configuración respectiva <PlatformTarget>x86</PlatformTarget>y <PlatformTarget>x64</PlatformTarget>en el ejemplo anterior.

gojimmypi
fuente