Jak określić platformę dla MSBuild?

155

Próbuję użyć programu MSBuild do zbudowania rozwiązania z określoną platformą docelową (potrzebuję obu plików binarnych, x86 i x64). Oto jak to wypróbowałem:

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

Jednak kompilacja zawsze kończy się niepowodzeniem, jeśli platforma jest inna niż „Dowolny procesor”. Co ja robię źle?

To jest while wyjściowe wydruki programu MSBuild:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: Rebuild / p: Configuration = Release / p: Platform = "x86" Microsoft (R) Build Engine Version 3.5.30729.1 [ Microsoft .NET Framework, wersja 2.0.50727.3082] Copyright (C) Microsoft Corporation 2007. Wszelkie prawa zastrzeżone.

Budowanie rozpoczęto 1.7.2010 8:28:10. Projekt „SolutionPath \ Solution.sln” w węźle 0 (Przebuduj t (y) targe). SolutionPath \ Solution.sln: błąd MSB4126: Określona konfiguracja rozwiązania „Release | x86” jest nieprawidłowa. Proszę określić poprawną konfigurację rozwiązania, używając właściwości Konfiguracja i Platforma (np. MSBuild.exe Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") lub pozostaw te właściwości puste, aby użyć domyślnej konfiguracji rozwiązania. Projekt budowy "SolutionPath \ Solution.sln" (Odbuduj t arget (y)) - BŁĄD.

Budowa nieudana.

„SolutionPath \ Solution.sln” (Rebuild target) (1) -> (ValidateSolutionConfiguration target) -> SolutionPath \ Solution.sln: błąd MSB4126: Określona konfiguracja rozwiązania „Release | x86” jest nieprawidłowa. Określ prawidłową konfigurację rozwiązania, używając właściwości Konfiguracja i Platforma (np. MSBuild.ex e Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") lub pozostaw te właściwości puste, aby użyć domyślnej konfiguracji rozwiązania.

0 Warning(s)
1 Error(s)

Upłynął czas 00: 00: 00.03

Jeśli spróbuję zbudować go na x86 / x64 za pomocą devenv, działa idealnie, jednak próbuję skonfigurować serwer kompilacji bez instalowania wszystkich niezbędnych wersji Visual Studio. Nawiasem mówiąc, jeśli istnieje lepsze darmowe narzędzie (obsługujące .NET Framework 4), bardzo chciałbym o tym usłyszeć.

David Božjak
źródło
1
Jak to się nie udaje? Może niektóre projekty nie obsługują platformy x86?
Brian
3
Czy na pewno nie potrzebujesz / p: Platform = "Win32"?
Andrew Wyatt,
Dla przyszłych czytelników, którzy docierają tutaj i zastanawiają się, jak uzyskać wersję 2017 programu MSBuild zainstalowaną na komputerze bez instalowania programu Visual Studio, zobacz to inne pytanie .
Wai Ha Lee
@AndrewWyatt - afaik - C ++ używa, Win32podczas gdy moden .NET używax86
Elliot Woods,
@ElliotWoods - dziękuję za wyjaśnienie w sprawie: Win32 / x86 - mój pogląd byłby tylko z punktu widzenia C ++.
Andrew Wyatt,

Odpowiedzi:

106

Jeśli chcesz zbudować swoje rozwiązanie dla x86 i x64 , Twoje rozwiązanie musi być skonfigurowane dla obu platform. Właściwie masz po prostu dowolny procesor konfigurację .

Jak sprawdzić dostępną konfigurację dla projektu

Aby sprawdzić dostępną konfigurację dla danego projektu, otwórz plik projektu ( *.csprojna przykład) i poszukaj PropertyGrouppo prawej Condition.

Jeśli chcesz budować w Releasetrybie dla x86, musisz mieć coś takiego w pliku projektu:

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

Jak tworzyć i edytować konfigurację w programie Visual Studio

Panel Configuration Manager
(źródło: microsoft.com )

Nowy przycisk platformy rozwiązań
(źródło: msdn.com )

Nowy panel platformy rozwiązań
(źródło: msdn.com )

Jak stworzyć i edytować konfigurację (w MSDN)

Julien Hoarau
źródło
Jaka jest różnica w korzystaniu z x86 lub x64?
Acaz Souza,
2
x86 buduje 32-bitowy plik dll / plik wykonywalny, a x64 buduje 64-bitowy plik dll / plik wykonywalny.
Benjamin Baumann
@Julien czy mogę / powinienem używać pliku .targets do konfigurowania współdzielonych konfiguracji?
Jan 'splite' K.
4
Niektóre projekty używają Win32zamiast x86na przykład CMakewygenerowane ( libssh2używają CMake).
Jeroen Wiert Pluimers
211

W programie MSBuild lub Teamcity użyj wiersza polecenia

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

lub użyj krótszej formy:

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

Jednak i tak musisz skonfigurować platformę w swoim projekcie, zobacz odpowiedź Juliena Hoarau.

Tomas Kubes
źródło
nie zdawał sobie sprawy z ustawienia podrzędnego dla / property, aby zidentyfikować zarówno konfigurację, jak i platformę. Dzięki
DRapp
7
Należy pamiętać, że program MSBuild nie bierze pod uwagę „konfiguracji rozwiązania” programu Visual Studio, ale zamiast tego ustawia właściwości przed wykonaniem xxproj dla każdego projektu rozwiązania. Platforma i konfiguracja będą takie same dla każdego projektu rozwiązania, bez względu na kombinację konfiguracji projektów wybranych w programie Visual Studio.
Laurent LA RIZZA
2
Lub prawdopodobnie krócej: / p: Configuration = Release; AnyOtherParameter = Abc123; Platform = x86
granadaCoder
1
Jeśli komuś to pomoże, argument wielowyrazowy w wierszu poleceń jest zawijany w podwójne cudzysłowy. Tak Platform="Any CPU"lub Platform="Mixed Platforms"dla tych, którzy tego potrzebują.
John Doe
14

Jeśli próbujesz to zrobić z poziomu wiersza poleceń, możesz napotkać problem polegający na ustawianiu dla Ciebie zmiennej środowiskowej „Platforma” dla całego komputera i działającej przeciwko Tobie. Mogę to odtworzyć, jeśli używam okna poleceń VS2012 zamiast zwykłego okna poleceń systemu Windows.

W wierszu polecenia wpisz:

ustawić platformę

W oknie poleceń VS2012 mam ustawienie wstępne „X64”. Wydaje się, że koliduje z tym, co jest w moim pliku rozwiązania.

W zwykłym oknie poleceń polecenie „set” powoduje wyświetlenie komunikatu „zmienna niezdefiniowana”… co jest dobre.

Jeśli wynik powyższego polecenia „set” nie zwraca żadnej wartości zmiennej środowiskowej, wszystko powinno działać.

JJMpls
źródło
2
W ten sposób oczywiście różni się okno poleceń VS2012 x64 od okna poleceń VS2012 x86. IOW, zgodnie z projektem, a nie „interferencja”
MSalters
0

W przypadku VS2017 i 2019 ... z nowoczesnymi plikami projektu zestawu SDK biblioteki podstawowej platformę można zmienić podczas procesu kompilacji. Oto przykład przejścia na anycpuplatformę tuż przed uruchomieniem wbudowanego CoreCompilezadania:

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

W moim przypadku buduję FPGA z zadaniami BeforeTargetsi AfterTargets, ale kompiluję aplikację C # w głównym CoreCompile. (częściowo dlatego, że mogę potrzebować jakiejś aplikacji wiersza poleceń, a częściowo dlatego, że nie mogłem wymyślić, jak pominąć lub zastąpićCoreCompile )

Aby zbudować dla wielu współbieżnych plików binarnych, takich jak x86 i x64: konieczne byłoby albo oddzielne, ręczne zadanie kompilacji, albo dwa oddzielne pliki projektu z odpowiednimi ustawieniami <PlatformTarget>x86</PlatformTarget>i <PlatformTarget>x64</PlatformTarget>ustawieniami z powyższego przykładu.

gojimmypi
źródło