Come posso specificare la piattaforma per MSBuild?


155

Sto cercando di utilizzare MSBuild per creare una soluzione con una piattaforma di destinazione specificata (ho bisogno di entrambi i binari, x86 e x64). Ecco come l'ho provato:

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

Tuttavia la compilazione fallisce sempre se la piattaforma è diversa da "Qualsiasi CPU". Che cosa sto facendo di sbagliato?

Questo è l'output di stampa di MSBuild:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: Rebuild / p: Configuration = Release / p: Platform = "x86" Microsoft (R) Build Engine Versione 3.5.30729.1 [ Microsoft .NET Framework, Versione 2.0.50727.3082] Copyright (C) Microsoft Corporation 2007. Tutti i diritti riservati.

Costruzione iniziata il 1.7.2010 8:28:10. Progetto "SolutionPath \ Solution.sln" sul nodo 0 (Ricostruisci t targe (s)). SolutionPath \ Solution.sln: errore MSB4126: la configurazione del soluto specificata "Release | x86" non è valida. Specificare una configurazione della configurazione valida utilizzando le proprietà di configurazione e piattaforma (ad es. MSBuild.exe Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") o lasciare vuoti questi oggetti per utilizzare la configurazione della soluzione predefinita. Fatto Progetto di costruzione "SolutionPath \ Solution.sln" (Ricostruisci t arget) - FAILED.

Build FAILED.

"SolutionPath \ Solution.sln" (Ricostruisci destinazione) (1) -> (ValidateSolutionConfiguration target) -> SolutionPath \ Solution.sln: errore MSB4126: la configurazione di s ssenzione specificata "Release | x86" non è valida. Specificare una configurazione di soluzione valida utilizzando le proprietà Configurazione e piattaforma (ad es. MSBuild.ex e Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") o lasciare vuote quelle proprietà vuote per utilizzare la configurazione della soluzione predefinita.

0 Warning(s)
1 Error(s)

Tempo trascorso 00: 00: 00.03

Se provo a crearlo per x86 / x64 con devenv funziona perfettamente, tuttavia sto provando a configurare un server di build senza installare tutte le versioni necessarie di Visual Studio. A proposito, se c'è uno strumento gratuito migliore (che supporta .NET framework 4) là fuori, mi piacerebbe saperlo.


1
Come fallisce? Forse alcuni progetti non supportano la piattaforma x86?
Brian

3
Sei sicuro di non aver bisogno di / p: Platform = "Win32"?
Andrew Wyatt,

Per i futuri lettori che arrivano qui e si chiedono come ottenere la versione 2017 di MSBuild installata su un computer senza installare Visual Studio, vedere questa altra domanda .
Wai Ha Lee,

@AndrewWyatt - afaik - C ++ utilizza Win32mentre Moden usa .NETx86
Elliot Woods l'

@ElliotWoods - grazie per il chiarimento in riferimento a: Win32 / x86 - la mia opinione sarebbe stata solo dal punto di vista C ++.
Andrew Wyatt,

Risposte:


106

Se si desidera creare la soluzione per x86 e x64 , la soluzione deve essere configurata per entrambe le piattaforme. In realtà hai solo una configurazione Any CPU .

Come verificare la configurazione disponibile per un progetto

Per verificare la configurazione disponibile per un determinato progetto, aprire il file di progetto ( *.csprojad esempio) e cercare a PropertyGroupcon il diritto Condition.

Se vuoi compilare in Releasemodalità per x86, devi avere qualcosa del genere nel tuo file di progetto:

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

Come creare e modificare la configurazione in Visual Studio

Pannello di Configuration Manager
(fonte: microsoft.com )

Nuovo pulsante della piattaforma della soluzione
(fonte: msdn.com )

Nuovo pannello della piattaforma della soluzione
(fonte: msdn.com )

Come creare e modificare la configurazione (su MSDN)


Qual è la differenza nell'uso di x86 o x64?
Acaz Souza,

2
x86 crea dll / eseguibile a 32 bit e x64 crea dll / eseguibile a 64 bit.
Benjamin Baumann,

@Julien posso / dovrei usare il file .targets per impostare configurazioni condivise?
Jan 'splite' K.

4
Alcuni progetti usano Win32invece che x86ad esempio CMakequelli generati ( libssh2usi CMake).
Jeroen Wiert Pluimers,

211

In MSBuild o Teamcity utilizzare la riga di comando

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

o usa una forma più breve:

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

Tuttavia, devi comunque impostare la piattaforma nel tuo progetto, vedi la risposta di Julien Hoarau.


non ha realizzato l'impostazione secondaria per / property per identificare sia la configurazione che la piattaforma. Grazie
DRapp

7
Attenzione, MSBuild non considera le "configurazioni della soluzione" di Visual Studio, ma imposta invece le proprietà prima di eseguire xxproj per ciascun progetto della soluzione. La piattaforma e la configurazione saranno le stesse per ciascun progetto della soluzione, indipendentemente dal mix di configurazioni di progetto selezionato in Visual Studio.
Laurent LA RIZZA,

2
O forse più breve: / p: Configuration = Release; AnyOtherParameter = Abc123; Platform = x86
granadaCoder

1
Se aiuta qualcuno, un argomento multiword nella riga di comando è racchiuso tra virgolette doppie. Quindi Platform="Any CPU"o Platform="Mixed Platforms"per chi ne ha bisogno.
John Doe,

14

Se stai provando a farlo dalla riga di comando, potresti riscontrare un problema in cui una variabile di ambiente 'Platform' a livello di macchina è impostata per te e lavora contro di te. Posso riprodurlo se uso la finestra di comando VS2012 anziché una normale finestra di comando di Windows.

Al prompt dei comandi digitare:

impostare la piattaforma

In una finestra di comando VS2012, ho un valore di preset 'X64'. Questo sembra interferire con qualunque cosa sia nel mio file di soluzione.

In una normale finestra di comando, il comando 'set' genera un messaggio "variabile non definita" ... il che è positivo.

Se il risultato del comando 'set' sopra non restituisce alcun valore della variabile di ambiente, dovresti essere pronto.


2
Questo è ovviamente il modo in cui una finestra di comando x2 VS2012 è differenziata da una finestra di comando x86 VS2012. IOW, dal design, non "interferenza"
MSalters,

0

Per VS2017 e 2019 ... con i moderni file di progetto SDK della libreria principale , la piattaforma può essere cambiata durante il processo di compilazione. Ecco un esempio per passare alla anycpupiattaforma, appena prima dell'esecuzione dell'attività integrata CoreCompile:

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

Nel mio caso, sto costruendo un FPGA con BeforeTargetse AfterTargetscompiti, ma compilando un'app C # nel principale CoreCompile. (in parte perché potrei desiderare una sorta di app da riga di comando e in parte perché non riuscivo a capire come omettere o ignorare CoreCompile)

Per creare più binari simultanei come x86 e x64: sarebbe necessaria un'attività di compilazione manuale separata o due file di progetto separati con i rispettivi <PlatformTarget>x86</PlatformTarget>e le <PlatformTarget>x64</PlatformTarget>impostazioni nell'esempio sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.