Wie gebe ich die Plattform für MSBuild an?

155

Ich versuche, mit MSBuild eine Lösung mit einer bestimmten Zielplattform zu erstellen (ich benötige beide Binärdateien, x86 und x64). So habe ich es versucht:

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

Der Build schlägt jedoch immer fehl, wenn sich die Plattform von "Beliebige CPU" unterscheidet. Was mache ich falsch?

Dies ist die while-Ausgabe, die MSBuild druckt:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: Neu erstellen / p: Konfiguration = Release / p: Plattform = "x86" Microsoft (R) Build Engine Version 3.5.30729.1 [ Microsoft .NET Framework, Version 2.0.50727.3082] Copyright (C) Microsoft Corporation 2007. Alle Rechte vorbehalten.

Build gestartet 1.7.2010 8:28:10. Projizieren Sie "SolutionPath \ Solution.sln" auf Knoten 0 (Ziel (e) neu erstellen). SolutionPath \ Solution.sln: Fehler MSB4126: Die angegebene Lösungskonfiguration "Release | x86" ist ungültig. Bitte geben Sie eine gültige Lösungskonfiguration mit den Eigenschaften Konfiguration und Plattform an (z. B. MSBuild.exe Solution.sln / p: Konfiguration = Debug / p: Plattform = "Beliebige CPU") oder lassen Sie diese Eigenschaften leer, um die Standardlösungskonfiguration zu verwenden. Fertig Bauprojekt "SolutionPath \ Solution.sln" (Ziel (e) neu erstellen) - FEHLGESCHLAGEN.

Build FAILED.

"SolutionPath \ Solution.sln" (Ziel neu erstellen) (1) -> (ValidateSolutionConfiguration-Ziel) -> SolutionPath \ Solution.sln: Fehler MSB4126: Die angegebene Lösungskonfiguration "Release | x86" ist ungültig. Bitte geben Sie eine gültige Lösungskonfiguration mit den Eigenschaften Konfiguration und Plattform an (z. B. MSBuild.ex e Solution.sln / p: Konfiguration = Debug / p: Plattform = "Beliebige CPU") oder lassen Sie diese Eigenschaften leer, um die Standardlösungskonfiguration zu verwenden.

0 Warning(s)
1 Error(s)

Verstrichene Zeit 00: 00: 00.03

Wenn ich versuche, es mit devenv für x86 / x64 zu erstellen, funktioniert es einwandfrei. Ich versuche jedoch, einen Build-Server einzurichten, ohne alle erforderlichen Versionen von Visual Studio zu installieren. Übrigens, wenn es ein besseres kostenloses Tool gibt (das .NET Framework 4 unterstützt), würde ich gerne davon hören.

David Božjak
quelle
1
Wie scheitert es? Vielleicht unterstützen einige Projekte die x86-Plattform nicht?
Brian
3
Sind Sie sicher, dass Sie / p: Platform = "Win32" nicht benötigen?
Andrew Wyatt
Für zukünftige Leser, die hierher kommen und sich fragen, wie die 2017-Version von MSBuild auf einem Computer installiert werden kann, ohne Visual Studio zu installieren, lesen Sie diese andere Frage .
Wai Ha Lee
@ AndrewWyatt - afaik - C ++ verwendet, Win32während moden .NET verwendetx86
Elliot Woods
@ElliotWoods - danke für die Klarstellung zu: Win32 / x86 - meine Ansicht wäre nur aus C ++ Sicht gewesen.
Andrew Wyatt

Antworten:

106

Wenn Sie Ihre Lösung für x86 und x64 erstellen möchten, muss Ihre Lösung für beide Plattformen konfiguriert sein. Eigentlich haben Sie nur eine beliebige CPU- Konfiguration.

So überprüfen Sie die verfügbare Konfiguration für ein Projekt

Um die verfügbare Konfiguration für ein bestimmtes Projekt zu überprüfen, öffnen Sie beispielsweise die Projektdatei *.csprojund suchen Sie nach einer PropertyGroupmit der rechten Condition.

Wenn Sie im ReleaseModus für erstellen möchten x86, müssen Sie Folgendes in Ihrer Projektdatei haben:

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

So erstellen und bearbeiten Sie die Konfiguration in Visual Studio

Configuration Manager-Bereich
(Quelle: microsoft.com )

Neue Schaltfläche für die Lösungsplattform
(Quelle: msdn.com )

Neues Lösungsplattform-Panel
(Quelle: msdn.com )

So erstellen und bearbeiten Sie die Konfiguration (auf MSDN)

Julien Hoarau
quelle
Was ist der Unterschied bei der Verwendung von x86 oder x64?
Acaz Souza
2
x86 erstellt eine 32-Bit-DLL / ausführbare Datei und x64 erstellt eine 64-Bit-DLL / ausführbare Datei.
Benjamin Baumann
@ Julien Kann / soll ich die .targets-Datei zum Einrichten gemeinsamer Konfigurationen verwenden?
Jan 'splite' K.
4
Einige Projekte verwenden Win32anstelle von x86beispielsweise CMakegenerierten Projekten ( libssh2Verwendungen CMake).
Jeroen Wiert Pluimers
211

Verwenden Sie in MSBuild oder Teamcity die Befehlszeile

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

oder verwenden Sie eine kürzere Form:

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

Sie müssen jedoch trotzdem eine Plattform in Ihrem Projekt einrichten, siehe die Antwort von Julien Hoarau.

Tomas Kubes
quelle
Die Untereinstellung für / property zur Identifizierung der Konfiguration und der Plattform wurde nicht erkannt. Vielen Dank
DRapp
7
Beachten Sie, dass MSBuild Visual Studio nicht als "Lösungskonfigurationen" betrachtet, sondern Eigenschaften festlegt, bevor xxproj für jedes Projekt der Lösung ausgeführt wird. Die Plattform und Konfiguration sind für jedes Projekt der Lösung gleich, unabhängig davon, welche Mischung von Projektkonfigurationen Sie in Visual Studio ausgewählt haben.
Laurent LA RIZZA
2
Oder möglicherweise kürzer: / p: Konfiguration = Release; AnyOtherParameter = Abc123; Plattform = x86
GranadaCoder
1
Wenn es jemandem hilft, wird ein Argument mit mehreren Wörtern in der Befehlszeile in doppelte Anführungszeichen gesetzt. Also Platform="Any CPU"oder Platform="Mixed Platforms"für diejenigen, die es brauchen.
John Doe
14

Wenn Sie dies über die Befehlszeile versuchen, tritt möglicherweise ein Problem auf, bei dem eine maschinenweite Umgebungsvariable "Plattform" für Sie festgelegt wird und gegen Sie arbeitet. Ich kann dies reproduzieren, wenn ich das VS2012-Befehlsfenster anstelle eines normalen Windows-Befehlsfensters verwende.

Geben Sie an der Eingabeaufforderung Folgendes ein:

Plattform einstellen

In einem VS2012-Befehlsfenster habe ich den Wert 'X64' voreingestellt. Das scheint alles in meiner Lösungsdatei zu stören.

In einem regulären Befehlsfenster führt der Befehl 'set' zu einer Meldung "Variable nicht definiert" ... was gut ist.

Wenn das Ergebnis Ihres obigen Befehls 'set' keinen Wert für Umgebungsvariablen zurückgibt, sollten Sie bereit sein.

JJMpls
quelle
2
Auf diese Weise unterscheidet sich ein VS2012 x64-Befehlsfenster natürlich von einem VS2012 x86-Befehlsfenster. IOW, von
Natur aus
0

Für VS2017 und 2019 ... mit den modernen SDK-Projektdateien der Kernbibliothek kann die Plattform während des Erstellungsprozesses geändert werden. Hier ist ein Beispiel für den Wechsel zur anycpuPlattform, kurz bevor die integrierte CoreCompileAufgabe ausgeführt wird:

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

In meinem Fall erstelle ich ein FPGA mit BeforeTargetsund AfterTargetsAufgaben, kompiliere aber hauptsächlich eine C # -App CoreCompile. (teils, weil ich eine Art Befehlszeilen-App haben möchte, teils, weil ich nicht herausfinden konnte, wie ich sie weglassen oder überschreiben kann CoreCompile)

Um Build für mehr, gleichzeitige Binärdateien wie x86 und x64: entweder eine separate, manuelle Build - Task mit den jeweiligen Bedarf oder zwei separate Projektdateien werden würde <PlatformTarget>x86</PlatformTarget>und <PlatformTarget>x64</PlatformTarget>Einstellungen im Beispiel oben.

gojimmypi
quelle