Visual Studio bổ sung Bất kỳ mục tiêu CPU CPU có nghĩa là gì?


496

Tôi có một số nhầm lẫn liên quan đến các tùy chọn xây dựng nền tảng .NET trong Visual Studio 2008.

Mục tiêu biên dịch "Bất kỳ CPU" là gì và nó tạo ra loại tệp nào? Tôi đã kiểm tra khả năng thực thi đầu ra của bản dựng "Bất kỳ CPU" này và thấy rằng chúng là các tệp thực thi x86 (ai sẽ không thấy điều đó sắp tới!). Vì vậy, có sự khác biệt nào giữa việc nhắm mục tiêu thực thi đến x86 so với "Bất kỳ CPU" nào không?

Một điều khác mà tôi nhận thấy, đó là các dự án C ++ được quản lý không có nền tảng này như là một tùy chọn. Tại sao vậy? Điều đó có nghĩa là sự nghi ngờ của tôi về các tệp thực thi "Bất kỳ CPU" nào là đơn giản 32 bit là đúng?


4
Một điều nữa cần xem xét khi quyết định sử dụng mục tiêu nền tảng nào: nếu mục tiêu của dự án Khởi độngAny CPUvà bạn đang chạy trên HĐH 64 bit, bạn sẽ mất khả năng Chỉnh sửa và tiếp tục trong khi gỡ lỗi. (Bạn đang gỡ lỗi một cách hiệu quả một quy trình 64 bit). Bạn có thể thực hiện mục tiêu dự án Startupx86 để phá vỡ điều này trong khi gỡ lỗi. (Các hội đồng được tham chiếu từ dự án khởi động có thể tiếp tục nhắm mục tiêu Any CPU.
Cristian Diaconescu

8
@CristiDiaconescu Với VS2013 Chỉnh sửa và tiếp tục hiện có thể
ms007

Tôi nghĩ rằng cần có một số lưu ý ở đây về việc dự án là một ứng dụng hay thư viện lớp vì việc thiết lập độ bit đích cho cái sau có thể ảnh hưởng đến tính khả dụng của nó đối với việc tiêu thụ các ứng dụng tùy thuộc vào nền tảng. Tôi gặp phải vấn đề này với một x86thư viện đang được sử dụng bởi một AnyCPUứng dụng mà tôi phải đặt Prefer 32-bitđể tránh lỗi tải.
SteveCinq

Câu trả lời:


386

Tập hợp AnyCPU sẽ JIT thành mã 64 bit khi được tải vào quy trình 64 bit và 32 bit khi được tải vào quy trình 32 bit.

Bằng cách giới hạn CPU, bạn sẽ nói: Có một cái gì đó đang được lắp ráp sử dụng (thứ gì đó có khả năng không được quản lý) yêu cầu 32 bit hoặc 64 bit.


3
Vì vậy, làm thế nào để tôi sản xuất lắp ráp sẽ JIT đến x64 trong C ++?
galets

50
Các dự án C ++ biên dịch thành mã gốc, do đó trình biên dịch JIT không liên quan ... do đó, bạn không thể làm những gì bạn đang yêu cầu.
cplotts

7
@cplotts: vì @galets đã hỏi câu hỏi này 3 tháng trước nên anh ấy sẽ không thấy câu trả lời của bạn. Sử dụng tiền tố @galets trong nhận xét của bạn tương tự như cách tôi có ở đây để anh ấy nhận được cảnh báo về câu trả lời của bạn.
AnthonyWJones

4
@AnthonyWJones Nói chung bạn đúng, trừ trường hợp người dùng là OP của câu hỏi, như trong trường hợp này, vì họ sẽ nhận được thông báo về tất cả các nhận xét.
Đánh dấu

12
@MarkHurd Trên thực tế, trong trường hợp này, OP sẽ không được thông báo. OP không được thông báo nhận xét cho câu trả lời trừ khi chúng được ping cụ thể bằng cú pháp @. OP chỉ tự động nhận thông báo về các bình luận được thêm vào câu hỏi ban đầu của họ.
RSW

322

Tôi nghĩ rằng hầu hết những điều quan trọng đã được nói, nhưng tôi chỉ nghĩ rằng tôi sẽ thêm một điều: Nếu bạn biên dịch thành Bất kỳ CPU nào và chạy trên nền tảng x64, thì bạn sẽ không thể tải các tệp DLL 32 bit, bởi vì ứng dụng của bạn chưa được khởi động trong WoW64 , nhưng các tệp DLL đó cần phải chạy ở đó.

Nếu bạn biên dịch thành x86, thì hệ thống x64 sẽ chạy ứng dụng của bạn trong WoW64 và bạn sẽ có thể tải các tệp DLL 32 bit.

Vì vậy, tôi nghĩ rằng bạn nên chọn "Bất kỳ CPU" nếu phụ thuộc của bạn có thể chạy trong cả hai môi trường, nhưng chọn x86 nếu bạn có phụ thuộc 32 bit. Bài viết này của Microsoft giải thích điều này một chút:

/ CLRIMAGETYPE (Chỉ định loại hình ảnh CLR)

Ngẫu nhiên, tài liệu khác của Microsoft này đồng ý rằng x86 thường là một lựa chọn di động hơn:

Chọn x86 nói chung là cấu hình an toàn nhất cho gói ứng dụng vì nó sẽ chạy trên hầu hết mọi thiết bị. Trên một số thiết bị, gói ứng dụng có cấu hình x86 sẽ không chạy, chẳng hạn như Xbox hoặc một số thiết bị IoT Core. Tuy nhiên, đối với PC, gói x86 là lựa chọn an toàn nhất và có phạm vi tiếp cận lớn nhất để triển khai thiết bị. Một phần đáng kể các thiết bị Windows 10 tiếp tục chạy phiên bản Windows x86.


2
Có lẽ bạn có thể chỉnh sửa câu trả lời của mình để nói cách người ta có thể xác định nếu một DLL đã cho chỉ là 32 bit. Theo như tôi biết, điều này sẽ chỉ ra điều đó. Tôi nghĩ rằng chúng tôi hy vọng các DLL cũng là "Bất kỳ CPU", thay vì chỉ x86.
Dan W

+1 một sự khác biệt quan trọng. Được yêu cầu sử dụng phụ thuộc 32 bit (không được xác định như vậy). Không thể tìm ra các thông báo lỗi thời gian chạy khó hiểu. Trong một linh cảm đã thay đổi mục tiêu cpu và nó đã hoạt động nhưng đã tìm kiếm "tại sao". Sẽ tốt đẹp vào một ngày nào đó khi mọi thứ là 64 bit và các vấn đề không tương thích sẽ có vẻ kỳ lạ như 16bit so với 32bit bây giờ.
Gerald Davis

2
@GeraldDavis - Tôi đồng ý. Điều trớ trêu là không có lý do công nghệ nào cho việc không thể trộn lẫn các phụ thuộc 32 bit và 64 bit (chỉ thiếu một lớp nền trong CLR) và tôi đã thất vọng trở lại trong những ngày đầu của .NET khi tôi thấy bit- Ness vẫn là một cái gì đó để xem xét khi triển khai (coi đây là VM / JIT, nó sẽ là một cơ hội để cung cấp thêm một chút giá trị gia tăng).
codenheim

1
@mrjoltcola: Thậm chí tệ hơn đó là cách mà Microsoft quyết định vì lý do tôi không thể hiểu rằng các mục đăng ký nên được chia thành vũ trụ 32 bit và 64 bit ngay cả khi chúng kiểm soát mọi thứ như màu màn hình, cài đặt mặc định, v.v.
supercat

Đây là câu trả lời mà tôi đã tìm kiếm ... Cảm ơn!
Murat từ phần mềm Daminion

52

Dưới đây là tổng quan nhanh giải thích các mục tiêu xây dựng khác nhau.

Theo kinh nghiệm của riêng tôi, nếu bạn đang muốn xây dựng một dự án sẽ chạy trên cả hai nền tảng x86 và x64 và bạn không có bất kỳ tối ưu hóa x64 cụ thể nào, tôi sẽ thay đổi bản dựng thành cụ thể là "x86".

Lý do cho điều này là đôi khi bạn có thể nhận được một số tệp DLL va chạm hoặc một số mã gây ra sự cố với WoW trong môi trường x64. Bằng cách chỉ định cụ thể x86, HĐH x64 sẽ coi ứng dụng là một ứng dụng x86 thuần túy và đảm bảo mọi thứ đều chạy trơn tru.


37
Điều này có thể là khủng khiếp nếu bạn viết cho môi trường máy chủ và muốn ứng dụng của bạn có thể sử dụng nhiều hơn 2GB bộ nhớ. Bạn cũng đang từ chối bất kỳ tối ưu hóa JIT x64 nào mà một ngày nào đó có thể đi xuống.
Austin Harris

Số lượng sự cố thời gian chạy mà tôi gặp phải với các phần tổng hợp AnyCPU là tất cả những lời biện minh mà tôi cần để ngừng sử dụng nó như một tùy chọn xây dựng trừ khi có ai đó yêu cầu rõ ràng các nhị phân hoạt động trên cả hai. Tôi chưa có ai yêu cầu x86 nhị phân trên x64 cho bất cứ điều gì trong hơn 10 năm.
kayleeFrye_onDeck

2
"Bằng cách chỉ định cụ thể x86, HĐH x64 sẽ coi ứng dụng là một ứng dụng x86 thuần túy và đảm bảo mọi thứ đều chạy trơn tru." - Xin lỗi, tôi không đồng ý. Hệ điều hành x64 vẫn sẽ chạy ứng dụng x86 của bạn trong WOW64
Mandeep Janjua

Đây chỉ là lời khuyên tồi cho những người không hiểu đầy đủ về tác động của nó. @AustinHarris đưa ra một ví dụ tuyệt vời. Hãy tưởng tượng một quy trình nhân viên web chỉ giới hạn trong vài GB RAM (gần đây tôi đã phải đối phó với vấn đề này trong sản xuất).
rgoliveira

47

Kiểm tra bài viết Visual Studio .NET Platform Target Giải thích .

Cài đặt mặc định, "Bất kỳ CPU", có nghĩa là lắp ráp sẽ chạy tự nhiên trên CPU mà nó hiện đang chạy. Có nghĩa là, nó sẽ chạy dưới dạng 64 bit trên máy 64 bit và 32 bit trên máy 32 bit. Nếu lắp ráp được gọi từ một ứng dụng 64 bit, nó sẽ hoạt động như một lắp ráp 64 bit, v.v.

Liên kết trên đã được báo cáo là bị hỏng, vì vậy đây là một bài viết khác với lời giải thích tương tự: Điều gì AnyCPU thực sự có nghĩa là của .NET 4.5 và Visual Studio 11


1
Liên kết bị hỏng đi đến một tên miền chưa sử dụng.
Jon Adams

Tôi đã thêm một liên kết đến một bài viết thứ hai với thông tin tương tự. Tôi đã để lại liên kết đầu tiên trong trường hợp tên miền đó được kích hoạt lại.
DCNYAM


39

"Bất kỳ CPU" nào có nghĩa là khi chương trình được khởi động, .NET Framework sẽ tìm ra, dựa trên độ bit của hệ điều hành, để chạy chương trình của bạn trong 32 bit hay 64 bit.

Có một sự khác biệt giữa x86Bất kỳ CPU nào : trên hệ thống x64, tệp thực thi được biên dịch cho X86 của bạn sẽ chạy dưới dạng thực thi 32 bit.

Theo như những nghi ngờ của bạn, chỉ cần đi đến dòng lệnh Visual Studio 2008 và chạy như sau.

dumpbin YourProgram.exe /headers

Nó sẽ cho bạn biết bitness của chương trình của bạn, cộng với nhiều hơn nữa.


7
Nếu nó được xây dựng trong "bất kỳ cpu" nào, nó sẽ hiển thị là 32 bit trong các tiêu đề dumpbin.
Kirbinator

34

Bất kỳ CPU có nghĩa là nó sẽ hoạt động trên mọi nền tảng. Điều này là do mã được quản lý tương tự như Java. Hãy nghĩ về nó như được biên dịch thành mã byte được .NET Framework diễn giải vào thời gian chạy.

C ++ không có tùy chọn này vì nó được biên dịch thành mã máy cụ thể.


12
+1 để trả lời một phần của câu hỏi mà không ai khác làm (về các dự án C ++ không có AnyCPU làm tùy chọn).
cplotts

C ++ / CLI có thể được biên dịch thành mã IL mà không cần bất kỳ mã máy nào (/ clr: thuần). Nhưng sizeof (void *) vẫn cần là hằng số thời gian biên dịch trong C ++; vì vậy ngay cả khi không có mã máy liên quan, bạn vẫn không thể tạo nhị phân hoạt động trên 32 bit và 64 bit cùng một lúc.
Daniel

5

Tôi khuyên bạn nên đọc bài viết này .

Khi sử dụng 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. CIL đượ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. CIL đượ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. CIL được biên dịch thành mã máy ARM.

8
Chỉ khi "Thích 32-bit" được chọn.
Mùa đông

Đó là mặc định kể từ Visual Studio 11
Moerwald

@Moerwald Tôi tin rằng đó là một lỗi đã được sửa. Nếu bạn đọc bài đăng mamczas làm tham chiếu đến, tác giả viết "trong Visual Studio UI hiện tại Ưu tiên 32 bit bit màu xám và không được kiểm tra, trong thực tế, nó được kích hoạt"; Trong phiên bản VS của tôi (15.8.0), tùy chọn vẫn bị mờ đi và không được kiểm tra, tuy nhiên, nó hoạt động như mong đợi (cờ 32BITPREF = FALSE trong phần CorFlags của hội đồng biên dịch)
Raikol Amaro

-1

Đây là cách tôi đã làm trong Visual Studio 2017:

  • Trong giải pháp thám hiểm
  • Nhấp chuột phải vào dự án của bạn
  • Nhấp vào "Thuộc tính"
  • Nhấp vào "Xây dựng"
  • Tắt tùy chọn "Thích 32-bit"
  • Và bạn có thể chọn "x64" từ mục tiêu Nền tảng.

Câu trả lời này là lạc đề.
Jonas

Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ. - Từ đánh giá
Bố già

Câu trả lời này không xuất hiện để giải quyết câu hỏi ít nhất.
EJoshuaS - Phục hồi Monica
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.