MSBuild platformunu nasıl belirlerim?


155

Belirtilen bir hedef platform ile bir çözüm oluşturmak için MSBuild kullanmaya çalışıyorum (her iki ikili, x86 ve x64 gerekir). Ben böyle denedim:

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

Ancak platform "Any CPU" dan farklıysa derleme her zaman başarısız olur. Neyi yanlış yapıyorum?

Bu çıkış MSBuild yazdırırken:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: Yeniden Oluştur / p: Yapılandırma = Sürüm / p: Platform = "x86" Microsoft (R) Build Engine Sürüm 3.5.30729.1 [ Microsoft .NET Framework, Sürüm 2.0.50727.3082] Telif Hakkı (C) Microsoft Corporation 2007. Tüm hakları saklıdır.

Derleme 1.7.2010 8:28:10'da başladı. 0 düğümünde "SolutionPath \ Solution.sln" projesi (Hedef (ler) i yeniden oluştur). SolutionPath \ Solution.sln: hata MSB4126: Belirtilen çözüm yapılandırması "Release | x86" geçersiz. Lütfen Yapılandırma ve Platform özelliklerini kullanarak geçerli bir çözüm c yapılandırması belirtin (örn. MSBuild.exe Solution.sln / p: Configuration = Debug / p: Platform = "Herhangi bir CPU") veya varsayılan çözüm yapılandırmasını kullanmak için bu prop'leri boş bırakın. Yapım Projesi "SolutionPath \ Solution.sln" (Yeniden oluştur (lar)) - BAŞARISIZ.

Yapı hatalı oldu.

"SolutionPath \ Solution.sln" (Hedefi yeniden oluştur) (1) -> (ValidateSolutionConfiguration hedefi) -> SolutionPath \ Solution.sln: hata MSB4126: Belirtilen "Yapılandırma | x86" yapılandırma yapılandırması geçersiz. Lütfen Yapılandırma ve Platform özelliklerini kullanarak geçerli bir çözüm yapılandırması belirtin (örn. MSBuild.ex e Solution.sln / p: Configuration = Debug / p: Platform = "Herhangi bir CPU") veya varsayılan çözüm yapılandırmasını kullanmak için bu özellikleri boş bırakın.

0 Warning(s)
1 Error(s)

Geçen Süre 00: 00: 00.03

Devenv ile x86 / x64 için oluşturmaya çalışırsam mükemmel çalışır, ancak Visual Studio'nun tüm gerekli sürümlerini yüklemeden bir yapı sunucusu kurmaya çalışıyorum. Bu arada, orada daha iyi bir ücretsiz araç varsa (.NET framework 4'ü destekler), bunu duymak isterim.


1
Nasıl başarısız olur? Belki bazı projeler x86 platformunu desteklemiyor olabilir?
Brian

3
/ P: Platform = "Win32" dosyasına ihtiyacınız olmadığından emin misiniz?
Andrew Wyatt

Gelecekteki okuyucular buraya gelip MSBuild'in 2017 sürümünün Visual Studio yüklemeden bir makineye nasıl yükleneceğini merak etmek için bu diğer soruya bakın .
Wai Ha Lee

@AndrewWyatt - afaik - Win32.NET kullanılırken C ++ kullanırx86
Elliot Woods

@ElliotWoods - açıklama için teşekkürler re: Win32 / x86 - benim görüşüm sadece C ++ bakış açısından olurdu.
Andrew Wyatt

Yanıtlar:


106

Çözümünüzü x86 ve x64 için oluşturmak istiyorsanız, çözümünüz her iki platform için de yapılandırılmalıdır. Aslında herhangi bir CPU yapılandırmanız var.

Bir proje için kullanılabilir yapılandırma nasıl kontrol edilir

Belirli bir proje için kullanılabilir yapılandırmayı kontrol etmek için proje dosyasını açın ( *.csprojörneğin) ve PropertyGroupsağda bir tane arayın Condition.

ReleaseModunu oluşturmak istiyorsanız x86, proje dosyanızda şöyle bir şey olması gerekir:

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

Visual Studio'da yapılandırma nasıl oluşturulur ve düzenlenir

Configuration Manager paneli
(kaynak: microsoft.com )

Yeni çözüm platformu düğmesi
(kaynak: msdn.com )

Yeni çözüm platformu paneli
(kaynak: msdn.com )

Yapılandırma nasıl oluşturulur ve düzenlenir (MSDN'de)


X86 veya x64 kullanmanın farkı nedir?
Acaz Souza

2
x86 32 bit dll / çalıştırılabilir ve x64 64 bit dll / çalıştırılabilir oluşturur.
Benjamin Baumann

@Julien, paylaşılan yapılandırmaları ayarlamak için .targets dosyasını kullanabilir miyim / kullanmalıyım?
Jan 'splite' K.

4
Örneğin, bazı projeler üretilenler Win32yerine kullanır ( kullanır ). x86CMakelibssh2CMake
Jeroen Wiert Pluimers

211

MSBuild veya Teamcity'de komut satırını kullanın

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

veya daha kısa bir form kullanın:

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

Yine de projenizde platform kurmanız gerekiyor, Julien Hoarau'nun cevabına bakın.


hem yapılandırmayı hem de platformu tanımlamak için / property alt ayarını gerçekleştirmedi. Teşekkürler
DRapp

7
MSBuild Visual Studio "Çözüm yapılandırmaları" dikkate değil, bunun yerine çözümün her proje için xxproj yürütmeden önce özellikleri ayarlar dikkat edin. Platform ve yapılandırma, Visual Studio'da seçtiğiniz proje yapılandırmaları karışımı ne olursa olsun, çözümün her projesi için aynı olacaktır.
Laurent LA RIZZA

2
Veya muhtemelen daha kısa: / p: Configuration = Release; AnyOtherParameter = Abc123; Platform = x86
granadaCoder

1
Herkese yardımcı olursa, komut satırındaki çok kelimeli bir bağımsız değişken çift tırnak işareti ile sarılır. Yani Platform="Any CPU"ya da Platform="Mixed Platforms"ihtiyacı olanlar için.
John Doe

14

Bunu komut satırından yapmaya çalışıyorsanız, makine genelindeki bir ortam değişkeni 'Platform'un sizin için ayarlandığı ve size karşı çalıştığı bir sorunla karşılaşıyor olabilirsiniz. Normal Windows Komut penceresi yerine VS2012 Komut penceresini kullanırsam bunu yeniden oluşturabilirim.

Komut istemine şunu yazın:

platform kurmak

Bir VS2012 Komut penceresinde, 'X64' önayar değerine sahibim. Çözüm dosyamdaki her şeye müdahale ediyor gibi görünüyor.

Normal bir Komut penceresinde, 'set' komutu "tanımlanmamış değişken" mesajıyla sonuçlanır ... bu iyidir.

Yukarıdaki 'set' komutunuzun sonucu herhangi bir ortam değişkeni değeri döndürmezse, gitmeniz iyi olur.


2
Bu elbette VS2012 x64 komut penceresinin VS2012 x86 komut penceresinden nasıl farklılaştığıdır. IOW, tasarım gereği, "müdahale" değil
MSalters

0

VS2017 ve 2019 için ... modern çekirdek kütüphane SDK proje dosyalarıyla , platform oluşturma işlemi sırasında değiştirilebilir. Yerleşik görev anycpuçalışmadan hemen önce platforma değiştirmek için bir örnek 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>

Benim durumumda, bir FPGA BeforeTargetsve AfterTargetsgörevler inşa ediyorum , ancak anada bir C # uygulaması derliyorum CoreCompile. (kısmen bir çeşit komut satırı uygulaması isteyebileceğim için, kısmen de nasıl atlayacağımı veya geçersiz kılacağımı anlayamadığım için CoreCompile)

X86 ve x64 gibi birden çok, eşzamanlı ikili dosyalar için oluşturmak için: ayrı, manuel oluşturma görevi veya yukarıdaki örnekte ilgili <PlatformTarget>x86</PlatformTarget>ve <PlatformTarget>x64</PlatformTarget>ayarlarla birlikte iki ayrı proje dosyası gerekir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.