2012-02-07 35 views
23

Sự hiểu biết của tôi là ứng dụng .NET là nền tảng độc lập, mã .NET thuần túy nên chạy trên x86 hoặc trên máy 64 bit. Trừ khi mã .NET của bạn gọi một số mã nguồn gốc, thì nó phụ thuộc vào nền tảng. Điều đó có đúng không?Có sự khác biệt nào giữa ứng dụng .NET 32 bit và ứng dụng .NET 64 bit không?

+0

Không thực sự, mọi ứng dụng .NET đều chạy rất nhiều mã gốc. Và có rất nhiều mã nguồn gốc có sẵn trong cả hai hương vị. Hệ điều hành là ví dụ tốt nhất. Tiếp theo là CLR và jitter. –

Trả lời

17

.NET ứng dụng có thể được biên dịch dưới dạng nhắm mục tiêu x86, x64 hoặc "Cả hai". Thông thường, bạn chỉ nhắm mục tiêu một nền tảng nếu bạn dựa vào điều khiển COM không có sẵn cho nền tảng khác, v.v.

3

Có, điều bạn nói là đúng. Pure .NET mã là nền tảng độc lập ("Bất kỳ CPU" nào trong Visual Studio) trừ khi các thư viện bên ngoài (COM và P/Invokes theo như tôi biết) được sử dụng. Sau đó, nền tảng của bạn phải phù hợp với nền tảng được sử dụng để xây dựng các thư viện bên ngoài.

9

Mã của bạn có thể được biên dịch để hoàn toàn độc lập với nền tảng hoặc bạn có thể nhắm mục tiêu nền tảng cụ thể. Đề xuất chuẩn là để lại các thư viện kiến ​​trúc trung lập (nghĩa là "CPU bất kỳ") và x86 mục tiêu cho các tệp thực thi. Những lý do tại sao Visual Studio 2010 sử dụng phương pháp này theo mặc định sẽ được giải thích ở đây: AnyCPU executables are usually more trouble than they're worth:

  1. Chạy ở hai chế độ rất khác nhau (x64 và x86) làm tăng độ phức tạp sản phẩm và chi phí xét nghiệm.
  2. 32 bit có xu hướng nhanh hơn một chút.
  3. Một số tính năng không khả dụng ở x64.
  4. Nếu nhiều hơn 4   không gian địa chỉ GB sẽ hữu ích, điều đúng đắn cần làm là nhắm mục tiêu chỉ x64 và tránh chi phí hỗ trợ hai nền tảng.

Tất nhiên, nếu bạn chỉ nhắm mục tiêu x86 sau đó mã của bạn vẫn sẽ chạy trên x64 qua WoW64.

+0

Tôi rất bối rối vì hành vi mặc định cho thực thi. nhắm mục tiêu đến x86? –

+0

Có, mục tiêu thực thi x86. Tạo một giải pháp mới trong VS2010, sau đó thêm một ứng dụng giao diện điều khiển, một ứng dụng Windows Forms, một ứng dụng WPF và một thư viện lớp. Nếu sau đó bạn xem trình quản lý cấu hình (nhấn chuột phải vào giải pháp, nó nằm trong trình đơn ngữ cảnh), bạn sẽ thấy rằng tất cả các ứng dụng đều được cấu hình cho x86, trong khi thư viện lớp được đặt cho AnyCPU. Điều này có thể đặc biệt khó chịu nếu bạn vô tình tạo một bản dựng AnyCPU (như tôi đã làm một vài tháng trước) - các tệp thi hành của bạn sẽ không được xây dựng, vì chúng không có cấu hình hợp lệ cho AnyCPU theo mặc định. –

+0

x86 có nghĩa là nó biên dịch nghiêm ngặt 32bit, x64 có nghĩa là nó biên dịch đúng 64bit và AnyCPU có nghĩa là nó biên dịch 32 bit trên hệ điều hành 32 bit và 64 bit trên hệ điều hành 64 bit. Nếu bạn thực hiện bất kỳ cuộc gọi đến COM/PInvoke, bạn cần phải nhắm mục tiêu các vòm chính xác vì COM/PInvoke sử dụng con trỏ thay vì tài liệu tham khảo. Tôi có thể hơi tắt, nhưng đó là ý tưởng chung. P.S. 64bit được truy cập vào các thanh ghi CPU phụ, vì vậy mã có thể nhanh hơn và tất cả các bit int 64 bit có thể được tính trong 1 chu kỳ. Vì vậy, bất kỳ biến Int64 nào sẽ chạy nhanh hơn. – Bengie

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