Bagaimana cara menentukan platform untuk MSBuild?

155

Saya mencoba menggunakan MSBuild untuk membangun solusi dengan platform target yang ditentukan (saya butuh kedua binari, x86 dan x64). Ini adalah bagaimana saya mencobanya:

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

Namun build selalu gagal jika platform berbeda dari "Any CPU". Apa yang saya lakukan salah?

Ini adalah output sementara yang dicetak oleh MSBuild:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: Rebuild / p: Konfigurasi = Rilis / p: Platform = "x86" Microsoft (R) Build Engine Versi 3.5.30729.1 [ Microsoft .NET Framework, Versi 2.0.50727.3082] Hak Cipta (C) Microsoft Corporation 2007. Hak cipta dilindungi Undang-Undang.

Membangun mulai 1.7.2010 8:28:10. Proyeksikan "SolutionPath \ Solution.sln" pada node 0 (Rebuild targe t (s)). SolutionPath \ Solution.sln: error MSB4126: Konfigurasi khusus yang ditentukan "Release | x86" tidak valid. Silakan tentukan solusi valid c onfigurasi menggunakan properti Konfigurasi dan Platform (mis. Solusi MSBuild.exe.sln / p: Konfigurasi = Debug / p: Platform = "CPU Apa Pun") atau biarkan rie prope kosong untuk menggunakan konfigurasi solusi default. Proyek Pembangunan Selesai "SolutionPath \ Solution.sln" (Bangun kembali) - GAGAL.

Bangun GAGAL.

"SolutionPath \ Solution.sln" (target Rebuild) (1) -> (Target ValidateSolutionConfiguration) -> SolutionPath \ Solution.sln: kesalahan MSB4126: Konfigurasi olution yang ditentukan "Rilis | x86" tidak valid. Silakan tentukan konfigurasi solusi yang valid menggunakan properti Konfigurasi dan Platform (mis. MSBuild.ex e Solution.sln / p: Configuration = Debug / p: Platform = "Any CPU") atau biarkan proyek-proyek tersebut kosong untuk menggunakan konfigurasi solusi default.

0 Warning(s)
1 Error(s)

Waktu Berlalu 00: 00: 00.03

Jika saya mencoba membangunnya untuk x86 / x64 dengan devenv berfungsi dengan baik, namun saya mencoba membuat server build tanpa menginstal semua versi Visual Studio yang diperlukan. Omong-omong, jika ada alat gratis yang lebih baik (yang mendukung .NET framework 4) di luar sana, saya ingin sekali mendengarnya.

David Božjak
sumber
1
Bagaimana bisa gagal? Mungkin beberapa proyek tidak mendukung platform x86?
Brian
3
Apakah Anda yakin tidak perlu / p: Platform = "Win32"?
Andrew Wyatt
Untuk pembaca masa depan yang datang ke sini dan bertanya-tanya bagaimana cara mendapatkan versi 2017 MSBuild diinstal pada mesin tanpa menginstal Visual Studio, lihat pertanyaan lain ini .
Wai Ha Lee
@AndrewWyatt - afaik - C ++ menggunakan Win32sementara moden .NET menggunakanx86
Elliot Woods
@ ElliotWoods - terima kasih atas klarifikasi ulang: Win32 / x86 - pandangan saya hanya akan dari sudut pandang C ++.
Andrew Wyatt

Jawaban:

106

Jika Anda ingin membangun solusi untuk x86 dan x64 , solusi Anda harus dikonfigurasikan untuk kedua platform. Sebenarnya Anda hanya memiliki konfigurasi CPU apa saja .

Cara memeriksa konfigurasi yang tersedia untuk suatu proyek

Untuk memeriksa konfigurasi yang tersedia untuk proyek yang diberikan, buka file proyek ( *.csprojmisalnya) dan cari PropertyGroupdengan hak Condition.

Jika Anda ingin membangun dalam Releasemode untuk x86, Anda harus memiliki sesuatu seperti ini di file proyek Anda:

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

Cara membuat dan mengedit konfigurasi di Visual Studio

Panel Manajer Konfigurasi
(sumber: microsoft.com )

Tombol platform solusi baru
(sumber: msdn.com )

Panel platform solusi baru
(sumber: msdn.com )

Cara membuat dan mengedit konfigurasi (di MSDN)

Julien Hoarau
sumber
Apa perbedaan menggunakan x86 atau x64?
Acaz Souza
2
x86 membangun 32 bit dll / executable dan x64 membangun 64 bit dlls / executable.
Benjamin Baumann
@ Julien dapat / haruskah saya menggunakan file .targets untuk mengatur konfigurasi bersama?
Jan 'splite' K.
4
Beberapa proyek menggunakan Win32alih-alih x86misalnya, yang CMakedihasilkan lakukan ( libssh2menggunakan CMake).
Jeroen Wiert Pluimers
211

Di MSBuild atau Teamcity gunakan baris perintah

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

atau gunakan formulir yang lebih pendek:

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

Namun Anda perlu mengatur platform di proyek Anda, lihat jawabannya oleh Julien Hoarau.

Tomas Kubes
sumber
tidak menyadari sub-pengaturan untuk / properti untuk mengidentifikasi konfigurasi dan platform. Terima kasih
DRapp
7
Berhati-hatilah karena MSBuild tidak mempertimbangkan Visual Studio "Konfigurasi Solusi", tetapi sebaliknya menyetel properti sebelum menjalankan xxproj untuk setiap proyek solusi. Platform dan konfigurasi akan sama untuk setiap proyek dari solusi, tidak peduli apa campuran konfigurasi proyek yang Anda pilih di Visual Studio.
Laurent LA RIZZA
2
Atau mungkin lebih pendek: / p: Konfigurasi = Rilis; AnyOtherParameter = Abc123; Platform = x86
granadaCoder
1
Jika itu membantu siapa pun, argumen multi-kata pada baris perintah dibungkus dengan tanda kutip ganda. Jadi Platform="Any CPU"atau Platform="Mixed Platforms"bagi mereka yang membutuhkannya.
John Doe
14

Jika Anda mencoba melakukan ini dari baris perintah, Anda mungkin menghadapi masalah di mana 'Platform' variabel lingkungan mesin sedang diatur untuk Anda dan bekerja melawan Anda. Saya dapat mereproduksi ini jika saya menggunakan jendela Command VS2012 daripada jendela Command windows biasa.

Pada prompt perintah ketik:

mengatur platform

Di jendela Command VS2012, saya memiliki nilai preset 'X64'. Itu tampaknya mengganggu apa pun yang ada di file solusi saya.

Di jendela Command biasa, perintah 'set' menghasilkan pesan "variable not defined" ... yang bagus.

Jika hasil dari perintah 'set' Anda di atas tidak mengembalikan nilai variabel lingkungan, Anda sebaiknya melanjutkan.

JJMpls
sumber
2
Ini tentu saja bagaimana jendela perintah VS2012 x64 dibedakan dari jendela perintah VS2012 x86. TKI, dengan desain, bukan "gangguan"
MSalters
0

Untuk VS2017 dan 2019 ... dengan file proyek SDK core library modern , platform dapat diubah selama proses pembangunan. Berikut adalah contoh untuk berubah ke anycpuplatform, tepat sebelum CoreCompiletugas bawaan berjalan:

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

Dalam kasus saya, saya sedang membangun FPGA dengan BeforeTargetsdan AfterTargetstugas, tetapi menyusun aplikasi C # di utama CoreCompile. (sebagian karena saya mungkin menginginkan semacam aplikasi command-line, dan sebagian karena saya tidak tahu cara menghilangkan atau menimpanya CoreCompile)

Untuk membangun beberapa biner bersamaan, seperti x86 dan x64: diperlukan tugas pembuatan manual yang terpisah atau dua file proyek terpisah dengan masing-masing <PlatformTarget>x86</PlatformTarget>dan <PlatformTarget>x64</PlatformTarget>pengaturan pada contoh di atas.

gojimmypi
sumber