Mục đích của cài đặt 32-bit ưu tiên của Windows trong Visual Studio là gì và nó thực sự hoạt động như thế nào?


204

Nhập mô tả hình ảnh ở đây

Tôi không rõ làm thế nào trình biên dịch sẽ tự động biết để biên dịch cho 64-bit khi cần. Làm thế nào để biết khi nào nó có thể tự tin nhắm mục tiêu 32-bit?

Tôi chủ yếu tò mò về cách trình biên dịch biết kiến ​​trúc nào cần nhắm mục tiêu khi biên dịch. Liệu nó có phân tích mã và đưa ra quyết định dựa trên những gì nó tìm thấy?



À, cảm ơn. Không thấy điều đó trước đây. Tôi vẫn tò mò về cách trình biên dịch tự động biết kiến ​​trúc nào sẽ nhắm mục tiêu. Có ý kiến ​​gì không?
Aaron

Câu trả lời:


219

Microsoft có một mục blog Những gì AnyCPU thực sự có nghĩa là .NET 4.5 và Visual Studio 11 :

Trong .NET 4.5 và Visual Studio 11, phô mai đã được di chuyển. Mặc định cho hầu hết các dự án .NET lại là AnyCPU, nhưng hiện tại có nhiều hơn một ý nghĩa đối với AnyCPU. Có một loại phụ bổ sung của AnyCPU, bất kỳ CPU nào được ưu tiên 32 bit CPU, là mặc định mới (về tổng thể, hiện có năm tùy chọn cho trình chuyển đổi trình biên dịch / nền tảng C #: x86, Itanium, x64, anycpu và anycpu32bitpreferred ). Khi sử dụng hương vị "Ưu tiên 32-bit" của AnyCPU, ngữ nghĩa như sau:

  • Nếu quy trình chạy trên hệ thống Windows 32 bit, thì nó chạy dưới dạng quy trình 32 bit. IL được biên dịch thành mã máy x86.
  • Nếu quy trình chạy trên hệ thống Windows 64 bit, thì nó chạy dưới dạng quy trình 32 bit. IL được biên dịch thành mã máy x86.
  • Nếu quy trình chạy trên hệ thống ARM Windows, thì nó chạy dưới dạng quy trình 32 bit. IL được biên dịch thành mã máy ARM.

Vì vậy, sự khác biệt giữa giữa các loại CPU được ưu tiên 32 bit và giữa các loại CPU được ưu tiên 32-bit và chỉ có một điều: sẽ chạy thành công.


12
+1. Ngoài ra, hộp kiểm "Thích 32 bit" chỉ được bật cho các dự án thực thi .NET 4.5+.
Lee Grissom

12
Một ưu điểm khác của anycpu32bitspreferred là một .exe khác chạy trong 64 bit có thể tải cụm đó.
Bruno Martinez

30
Cá nhân tôi nghĩ thật kinh khủng khi họ đặt mặc định này mà không có cài đặt Công cụ nào để tắt. Tệ hơn nữa, bạn không thể tìm kiếm nó vì không có trong các tệp csproj trừ khi tắt! Có thể được thêm vào do tính không tương thích của Tự động hóa Office với CPUAny trên máy x64 với hầu hết mọi người cài đặt Office 32 bit.
Dave

6
@BrianDavidBerman, nếu bạn đặt sai thành 32 - nhưng được ưu tiên và đặt x64 hoặc Bất kỳ CPU nào trên máy 64 bit.
Lex Li

6
Sự khác biệt giữa x86 và Bất kỳ CPU 32 bit nào được ưu tiên là trong trường hợp sau, cờ tinyeaddresswar được đặt trên tệp thực thi. Điều này có nghĩa là quá trình 32 bit chạy trên HĐH 64 bit có thể sử dụng 2GB bộ nhớ ở chế độ x86 và 4GB bộ nhớ ở bất kỳ chế độ 32 bit CPU ưa thích nào.
Nic

6

Đây là một câu trả lời đơn giản:

Ứng dụng vòm.

Lưu ý: AnyCPU-32bitPreferred chỉ khả dụng trong .Net phiên bản 4.5 trở lên.


2
Sự khác biệt giữa "chạy dưới dạng 32 bit" so với chạy là "WoW64". Tôi nghĩ WoW64 = "Windows (32-bit) trên Windows64" và cần cho bất kỳ ứng dụng 32-bit nào chạy.
Peter Cordes

Có một nguồn cho điều này? Dường như mọi nơi khác vẫn nói với tôi mặc định là anycpu32bitpreferred, đó là một sự khác biệt lớn đối với những người chạy trên các máy windows 64 bit (rất nhiều).
Ran Sagy

@RanSagy bạn chỉ có thể kiểm tra nó bằng cách tạo một dự án mới và kiểm tra Project -> Properties -> Build tab -> Platform target... nhưng lưu ý rằng AnyCPU-32bitPreferredchỉ có sẵn trong .Net phiên bản 4.5 trở lên. Đó là lý do tại sao mặc định là AnyCPU.
Yousha Aleayoub

Trong một số trường hợp, mỏ của tôi bị mờ đi; Tôi chỉ hy vọng có một số tài liệu về những gì xảy ra trong .net 4.5+ hoặc .net tiêu chuẩn / lõi (hoặc thực sự, MSBuild 16)
Ran Sagy

-1

Lý do là: trong trường hợp bạn không muốn sử dụng thêm bộ nhớ với các ứng dụng 64 bit. Điều đó có nghĩa là, nếu ứng dụng của bạn là AnyCPU , bạn muốn chạy dưới dạng 32 bit.

Để thêm nữa, cài đặt trong Visual Studio nhắm mục tiêu CLR cụ thể:

Visual Studio cài đặt phiên bản 32 bit của CLR trên máy tính x86 và cả phiên bản 32 bit và phiên bản CLR 64 bit thích hợp trên máy tính Windows 64 bit. (Vì Visual Studio là một ứng dụng 32 bit, khi được cài đặt trên hệ thống 64 bit, nó chạy dưới WOW64.)

Vui lòng tham khảo bài viết Ứng dụng 64 bit ( MSDN ).


1
Tôi không chắc điều đó chính xác. Như tôi hiểu rằng các tệp thực thi .NET bất kể 32 hay 64 vẫn bị giới hạn khoảng 2 GB cho mỗi quy trình.
JP Richardson

1
Chỉnh sửa câu trả lời của tôi. Nhưng không chắc chắn nếu đây là những gì bạn đang tìm kiếm :)
Peru

2
@Aaron, về cơ bản, trình biên dịch sẽ đặt cờ cho thời gian chạy để quyết định xem có ổn không khi tải lắp ráp (tức là lắp ráp khối chỉ x86 được tải trong quy trình x64) và cách bắt đầu quy trình (đối với EXE mới) dựa trên các cờ. Tôi tin rằng IL là giống nhau cho cả hai hương vị.
Alexei Levenkov

1
@JPRichardson Có bạn đúng. Nhưng trong .net 4.5, bạn có tùy chọn để tăng kích thước. giới thiệu MSDN
Peru

40
Nếu sử dụng nhiều hơn 2GB nếu cờ "LargeAddressAware" được đặt trên tệp thực thi. Các hạn chế 2GB duy nhất tôi biết là về kích thước mảng / phân bổ bị giới hạn bởi phạm vi Int32 (khoảng 2GB).
Alexei Levenkov
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.