2009-07-02 28 views
29

Tôi đang sử dụng MSBuild (qua NAnt) để biên dịch một nhóm gồm VB.NET hội đồng. Vì các assembly này phụ thuộc vào COM Interop, tôi cần đảm bảo rằng chúng chạy trong chế độ 32 bit trên hệ điều hành 64 bit. Tôi có thể nhận được các hội đồng thực thi để biên dịch thành 32-bit bằng cách thay đổi dự án trong Visual Studio, nhưng tôi thực sự muốn có thể buộc tất cả các tệp thi hành được biên dịch sang chế độ 32 bit trên máy chủ xây dựng.Làm cách nào để buộc MSBuild biên dịch cho chế độ 32 bit?

Tôi đã thử một số thông số dòng lệnh để MSBuild không có may mắn:

  • /p: Nền tảng = win32
  • /p: Nền tảng x86 =
  • /p: ProcessorArchitecture = x86

Tôi đang làm gì sai? Có một số tham chiếu đến các thuộc tính mà MSBuild sử dụng khi biên dịch các dự án VB không?

Trả lời

18

Nếu bản thân hội đồng sẽ luôn là 32 bit, tại sao không thêm cài đặt vào tệp .vbproj? Điều đó sẽ đưa MSBuild ra khỏi phương trình.

Chỉ cần thêm dòng sau vào PropertyGroup ban đầu trong file .vbproj

<PlatformTarget>x86</PlatformTarget> 
+0

Không phải câu trả lời tôi đang tìm kiếm nhưng cuối cùng là đơn giản nhất/an toàn nhất. –

+0

Nếu đây không phải là câu trả lời bạn đang tìm kiếm, tại sao nó được chấp nhận? ;-) @ Câu trả lời của Nader phải là câu trả lời được chấp nhận. :-) – darrenp

42

Theo MSDN, bạn đang làm điều đúng đắn. Có vẻ như /p:Platform=x86, nhưng thực ra, có thể là /p:PlatformTarget=x86.

Cố gắng chỉ gọi MSBuild trực tiếp với tham số đó (chắc chắn rằng nó không phải là một vấn đề với tập tin Nant của bạn. Nhìn vào việc xây dựng đầu ra cho việc xây dựng cấu hình đúng (gỡ lỗi/phát hành).

+4

+1 tùy chọn -p: PlatformTarget làm việc cho tôi –

+6

Trên thực tế, nền tảng là nền tảng "giải pháp" và PlatformTarget là nền tảng dự án. Bạn có thể có bất kỳ giá trị tùy chỉnh nào bạn muốn trong Nền tảng nhưng PlatformTarget phải là một trong số: x86, x64, Itanium hoặc anycpu. –

+0

có, ví dụ tôi vừa mới sử dụng: MSBuild/p: PlatformTarget = "x86"/p: RunCodeAnalysis = False –

3

Trong Giải pháp Explorer, nhấp chuột phải vào nút gốc ->Trình quản lý cấu hình.Bạn cần xác định cấu hình toàn bộ giải pháp để hướng dẫn từng dự án bên trong xây dựng dưới dạng 32 bit (Lưu ý: có thể bạn đã có một dự án nếu bạn đã từng đặt ít nhất một dự án để xây dựng dưới dạng 32 bit.) Để biết hướng dẫn từng bước, hãy xem bài đăng trên blog MSDN Solution Configurations.

Sau đó, bạn chỉ định "nền tảng" và "hương vị" mong muốn trong các tệp Team Build.proj/.targets của mình. Ví dụ:

<ConfigurationToBuild Include="Release|x86"> 
    <FlavorToBuild>Release</FlavorToBuild> 
    <PlatformToBuild>x86</PlatformToBuild> 
</ConfigurationToBuild> 

Bạn có thể chỉ định nhiều hơn một trong các phần thuộc tính này để tạo nhiều kết hợp. Tôi sẽ sao chép/dán chuỗi "Release | x86" (hoặc bất kỳ thứ gì giống như) trực tiếp từ tệp .sln của bạn để đảm bảo nó khớp chính xác - bạn không thể lấy trực tiếp từ Solution Explorer.

Về nhận xét của bạn:

MSBuild đánh giá tài sản là khá phức tạp vì nó pha trộn phong cách khai báo và cấp bách. Xem bài đăng trên blog MSBuild Property Evaluation để biết chi tiết. Tôi không muốn dựa vào sự tinh tế của nó.

Đúng là thuộc tính được chỉ định trên dòng lệnh sẽ ghi đè mọi thứ khác, nhưng Team Build có một lớp phức tạp khác. The ComputeConfigurationList task is called repeatedly via a recursive MSBuild invokation, not as an ordinary task.Cách nó kéo tắt này là để lấy các thuộc tính thông thường như PlatformToBuild và bọc chúng trong một tập hợp các thuộc tính toàn cầu được gọi là ConfigurationToBuild.PlatformToBuild (vv) được tạo ra khi đang bay, một lần cho mỗi cấu hình. Điều này làm cho công cụ Team Build linh hoạt hơn nhiều trong nội bộ, nhưng nó cũng làm cho việc tấn công hành vi dòng lệnh bạn muốn trở nên khó khăn hơn.

Bạn có thể thử đặt ConfigurationToBuild.PlatformToBuild trực tiếp trên dòng lệnh - nó có thể hoạt động, tôi không chắc chắn. Nhưng nó chắc chắn sẽ ngăn bạn không bao giờ xây dựng nhiều hơn một cấu hình trong một định nghĩa xây dựng duy nhất. Vì lý do này, tôi gắn bó với lời khuyên của tôi ở trên.

+0

Vì vậy, những gì tôi nhận được là không có cách nào để ép buộc một nền tảng cụ thể từ dòng lệnh trừ khi nhà phát triển thiết lập dự án để có một nền tảng x86? Tôi thực sự muốn tránh bước đó nếu có thể (vì tôi không có quyền kiểm soát các dự án mới khi chúng được tạo). –

+0

Có và không. Tôi đã chỉnh sửa câu trả lời của mình để cung cấp thêm chi tiết. Nếu bạn thực sự muốn biết công cụ này hoạt động như thế nào, hãy đọc (nhưng đừng chạm vào!) Tệp Microsoft.TeamFoundation.Build.targets được tìm thấy trong% ProgramFiles% \ MSBuild –

1

Sau khi gặp sự cố tương tự, tôi đã chuyển từ sử dụng phiên bản MSBuild tại C:\WINDOWS\Microsoft.NET\Framework64 ... sang phiên bản tại C:\WINDOWS\Microsoft.NET\Framework (không 64) và mọi thứ được biên dịch tốt.

+0

Các thành phần thực sự được biên dịch thành công trên hệ điều hành 32 bit (không 64bit khung được cài đặt) và sau đó thất bại tại thời gian chạy trên một hệ điều hành 64 bit. Nhưng tôi nghi ngờ bạn thậm chí không thể biên dịch các thành phần nhất định trên khuôn khổ 64 bit, vì vậy đó là một mẹo hay. –

11

Chỉ trong trường hợp này sẽ giúp, tôi đã sử dụng dòng lệnh này để xây dựng nền tảng mục tiêu x86 của tôi:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe my.sln /t:build /p:Configuration=Release;Platform=x86 
0

Các Nant msbuild-Task câu trả lời cho câu hỏi này:

<msbuild project="your.sln"> 
    <property name="PlatformTarget" value="x86" /> 
</msbuild> 
0

Đối với MSBuild phiên bản 15 nó là /p: PlatformTarget = x86

Các vấn đề liên quan