Làm cách nào để chỉ định nền tảng cho MSBuild?


155

Tôi đang cố gắng sử dụng MSBuild để xây dựng một giải pháp với nền tảng đích được chỉ định (tôi cần cả nhị phân, x86 và x64). Đây là cách tôi đã thử nó:

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

Tuy nhiên, quá trình xây dựng luôn thất bại nếu nền tảng khác với "Bất kỳ CPU". Tôi đang làm gì sai?

Đây là bản in MSBuild đầu ra:

C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5> MsBuild SolutionPath \ Solution.sln / t: Rebuild / p: Cấu hình = Phát hành / p: Platform = "x86" Microsoft (R) Build Engine Phiên bản 3.5.30729.1 [ Microsoft .NET Framework, Phiên bản 2.0.50727.3082] Bản quyền (C) Microsoft Corporation 2007. Bảo lưu mọi quyền.

Xây dựng bắt đầu 1.7.2010 8:28:10. Dự án "SolutionPath \ Solution.sln" trên nút 0 (Rebuild tund t (s)). SolutionPath \ Solution.sln: error MSB4126: Cấu hình giải pháp được chỉ định "Phát hành | x86" không hợp lệ. Vui lòng chỉ định một giải pháp hợp lệ c onfiguration bằng cách sử dụng các thuộc tính Cấu hình và Nền tảng (ví dụ: MSBuild.exe Solution.sln / p: Cấu hình = Debug / p: Platform = "Bất kỳ CPU") hoặc để trống các giá trị prope đó để sử dụng cấu hình giải pháp mặc định. Dự án xây dựng đã hoàn thành "SolutionPath \ Solution.sln" (Rebuild t arget (s)) - FAILED.

Thiết lập thất bại.

"SolutionPath \ Solution.sln" (Rebuild target) (1) -> (TargetateSolutionConfiguration target) -> SolutionPath \ Solution.sln: error MSB4126: Cấu hình olution được chỉ định "Phát hành | x86" không hợp lệ. Vui lòng chỉ định cấu hình giải pháp hợp lệ bằng cách sử dụng các thuộc tính Cấu hình và Nền tảng (ví dụ: MSBuild.ex e Solution.sln / p: Cấu hình = Debug / p: Platform = "Bất kỳ CPU") hoặc để trống các phần mềm chuyên nghiệp để sử dụng cấu hình giải pháp mặc định.

0 Warning(s)
1 Error(s)

Thời gian đã trôi qua 00: 00: 00.03

Nếu tôi cố gắng xây dựng nó cho x86 / x64 với devenv thì nó hoạt động hoàn hảo, tuy nhiên tôi đang cố gắng thiết lập một máy chủ xây dựng mà không cài đặt tất cả các phiên bản cần thiết của Visual Studio. Nhân tiện, nếu có một công cụ miễn phí tốt hơn (hỗ trợ .NET framework 4) ngoài kia, tôi rất muốn nghe về nó.


1
Làm thế nào để nó thất bại? Có thể một số dự án không hỗ trợ nền tảng x86?
Brian

3
Bạn có chắc chắn không cần / p: Platform = "Win32"?
Andrew Wyatt

Đối với những độc giả tương lai đến đây và tự hỏi làm thế nào để cài đặt phiên bản MSBuild 2017 trên máy mà không cần cài đặt Visual Studio, hãy xem câu hỏi khác này .
Wai Ha Lee

@AndrewWyatt - afaik - C ++ sử dụng Win32trong khi moden .NET sử dụngx86
Elliot Woods

@ElliotWoods - cảm ơn bạn đã làm rõ lại: Win32 / x86 - quan điểm của tôi chỉ có thể là từ quan điểm của C ++.
Andrew Wyatt

Câu trả lời:


106

Nếu bạn muốn xây dựng giải pháp cho x86x64 , giải pháp của bạn phải được định cấu hình cho cả hai nền tảng. Trên thực tế bạn chỉ có một cấu hình CPU bất kỳ .

Làm thế nào để kiểm tra cấu hình có sẵn cho một dự án

Để kiểm tra cấu hình có sẵn cho một dự án nhất định, hãy mở tệp dự án ( *.csprojví dụ) và tìm kiếm PropertyGroupvới bên phải Condition.

Nếu bạn muốn xây dựng trong Releasechế độ cho x86, bạn phải có một cái gì đó như thế này trong tệp dự án của bạn:

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

Cách tạo và chỉnh sửa cấu hình trong Visual Studio

Bảng quản lý cấu hình
(nguồn: microsoft.com )

Nút nền tảng giải pháp mới
(nguồn: msd.com )

Bảng điều khiển nền tảng giải pháp mới
(nguồn: msd.com )

Cách tạo và chỉnh sửa cấu hình (trên MSDN)


Sự khác biệt khi sử dụng x86 hoặc x64 là gì?
Acaz Souza

2
x86 xây dựng 32 bit dll / thực thi và x64 xây dựng 64 bit dlls / thực thi.
Benjamin Baumann

@Julien tôi có thể / nên sử dụng tệp .target để thiết lập cấu hình được chia sẻ không?
Jan 'splite' K.

4
Một số dự án sử dụng Win32thay vì x86ví dụ, CMakenhững dự án được tạo ra ( libssh2sử dụng CMake).
Jeroen Wiert Pluimers

211

Trong MSBuild hoặc Teamcity sử dụng dòng lệnh

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

hoặc sử dụng hình thức ngắn hơn:

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

Tuy nhiên, dù sao bạn cũng cần thiết lập nền tảng trong dự án của mình, xem câu trả lời của Julien Hoarau.


đã không nhận ra cài đặt phụ cho / property để xác định cả cấu hình và nền tảng. Cảm ơn
DRapp

7
Coi chừng MSBuild không xem xét "Cấu hình giải pháp" của Visual Studio, mà thay vào đó đặt các thuộc tính trước khi thực hiện xxproj cho từng dự án của giải pháp. Nền tảng và cấu hình sẽ giống nhau cho từng dự án của giải pháp, bất kể kết hợp cấu hình dự án nào bạn đã chọn trong Visual Studio.
Laurent LA RIZZA

2
Hoặc có thể ngắn hơn: / p: Cấu hình = Phát hành; AnyOtherParameter = Abc123; Platform = x86
granadaCoder

1
Nếu nó giúp được bất cứ ai, một đối số đa từ trên dòng lệnh được gói bằng dấu ngoặc kép. Vì vậy, Platform="Any CPU"hoặc Platform="Mixed Platforms"cho những người cần nó.
John Doe

14

Nếu bạn đang cố gắng thực hiện việc này từ dòng lệnh, bạn có thể gặp phải một vấn đề trong đó biến môi trường toàn máy 'Nền tảng' đang được đặt cho bạn và chống lại bạn. Tôi có thể tái tạo điều này nếu tôi sử dụng cửa sổ Lệnh VS2012 thay vì cửa sổ Lệnh thông thường.

Tại dấu nhắc lệnh:

thiết lập nền tảng

Trong cửa sổ Lệnh VS2012, tôi có giá trị đặt trước 'X64'. Điều đó dường như can thiệp vào bất cứ điều gì trong tập tin giải pháp của tôi.

Trong cửa sổ Lệnh thông thường, lệnh 'set' dẫn đến thông báo "biến không được xác định" ... rất tốt.

Nếu kết quả của lệnh 'set' của bạn ở trên không trả về giá trị biến môi trường, bạn sẽ thấy tốt.


2
Tất nhiên đây là cách cửa sổ lệnh VS2012 x64 được phân biệt với cửa sổ lệnh VS2012 x86. IOW, theo thiết kế, không "can thiệp"
MSalters

0

Đối với VS2017 và 2019 ... với các tệp dự án SDK thư viện lõi hiện đại , nền tảng có thể được thay đổi trong quá trình xây dựng. Đây là một ví dụ để thay đổi anycpunền tảng, ngay trước khi CoreCompiletác vụ tích hợp chạy:

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

Trong trường hợp của tôi, tôi đang xây dựng một FPGA với BeforeTargetsAfterTargetscác tác vụ, nhưng biên dịch một ứng dụng C # trong chính CoreCompile. (một phần vì tôi có thể muốn một số loại ứng dụng dòng lệnh và một phần vì tôi không thể tìm ra cách bỏ qua hoặc ghi đè CoreCompile)

Để xây dựng cho nhiều tệp nhị phân đồng thời, chẳng hạn như x86 và x64: cần có một tác vụ xây dựng thủ công, riêng biệt hoặc hai tệp dự án riêng biệt với các cài đặt tương ứng <PlatformTarget>x86</PlatformTarget><PlatformTarget>x64</PlatformTarget>trong ví dụ ở trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.