2011-01-10 30 views
8

Điều này khiến tôi băn khoăn về cách tính năng "AnyCPU" trong .NET hoạt động: Nó tải tệp thực thi là 32 -bit nếu hệ thống là 32-bit, và là 64-bit nếu hệ thống là 64-bit (mà bạn có thể dễ dàng xác nhận với Task Manager). Vì vậy, rõ ràng, điều này là không thể.Viết chương trình Cross-Platform (tương thích 32-bit và 64-bit) cho Windows (như AnyCPU in .NET)

Câu hỏi đặt ra là, chính xác Microsoft đã làm như thế nào? Windows ban đầu không biết về khung công tác .NET, vì vậy Windows PE Loader không thể tìm kiếm bất kỳ tính năng bổ sung nào trong các tiêu đề PE cho tiêu đề CLR; tính năng này phải được thêm vào bởi một số loại mở rộng chế độ hạt nhân. Nhưng khung công tác .NET dường như không cài đặt được thứ gì ... Tôi hoàn toàn mất đi cách thực thi tương tự có thể là bản địa 32-bit và 64-bit cùng một lúc, đặc biệt là do việc tháo gỡ mscoree.dll không thậm chí không hiển thị các tham chiếu đến các hàm gốc không có giấy tờ.

Có ai có kiến ​​thức và/hoặc dự đoán hợp lý về cách thực hiện điều này không? Đó rõ ràng là có thể (vì vậy không nói những điều như "đó là không thể"), và nó làm cho tôi muốn thử viết một mẹ đẻ cross-platform EXE ...


Edit:

Như một lưu ý phụ, hãy xem xét cách bạn không thể chạy thực thi 32 bit trong môi trường Windows PE 64 bit ... có là một số cách để mở rộng hoặc sửa đổi trình tải PE với một số loại "plugin", đúng ?

+0

Có một số chương trình (ví dụ: Process Explores) thực hiện việc này để phân phối tệp thực thi 32 bit * khởi chạy * hình ảnh 64 bit nếu có thể. Ví dụ. là một "AnyCPU" thực thi bao giờ hết, nhưng một PE 32-bit? –

+0

@pst: Tôi hoàn toàn nhận thức được những điều đó, nhưng không, chúng khác nhau. Các thực thi AnyCPU là 64-bit từ thời điểm chúng bắt đầu trên hệ điều hành 64 bit - không có giải nén và không có gì giống như "Hãy JIT mã bytecode này vào 64-bit và sau đó khởi động lại quá trình 64-bit." Đó là điều khiến tôi bối rối. – Mehrdad

Trả lời

5

Câu hỏi của bạn dựa trên sự hiểu lầm. Dưới đây là những sai lầm:

của Windows ban đầu không biết về .NET framework

Trên thực tế, kể từ Windows XP, Windows IS aware of the .NET executable format. Và XP là phiên bản đầu tiên của Windows hỗ trợ 64 bit.

Vì vậy, tiêu đề PE được đánh dấu 32 bit và bảng nhập gốc tham chiếu 32 bit mscoree, mà trên Windows 2000 trở về trước, khiến cho .NET 32 bit được tải. DllMain cho mscoree bắt đầu JITting mã ứng dụng và sửa đổi điểm nhập cho ứng dụng chính.

Windows XP trở lên, nhận thức được siêu dữ liệu .NET, nhận ra rằng đó là AnyCPU và tải khung thích hợp.

Here's probably more than you ever wanted to know about the process.

Vì vậy, không, không có xuất xứ AnyCPU exe. Mặc dù bạn có thể nhúng chương trình DOS 16 bit trong PE 32 bit, bạn không thể có kết hợp 32-bit và 64-bit .exe

+0

Không phải khung .NET xuất hiện * sau * bản phát hành của XP (ít nhất, đó là những gì tôi nghĩ mình đã nhớ)? Tôi nghĩ [XP đã được phát hành vào năm 2001] (http://en.wikipedia.org/wiki/Windows_xp) và [.NET năm 2002] (http://en.wikipedia.org/wiki/.NET_Framework) .. – Mehrdad

+0

@Lambert: Các giai đoạn phát triển chồng lên nhau, phát triển .NET bắt đầu một cái gì đó giống như 5 năm trước khi phát hành lần đầu vào năm 2002, vì vậy Microsoft có rất nhiều thời gian để đưa móc vào XP. Và như tôi đã nói, Windows 2000 chỉ là 32-bit. Dù sao, đó là ngày phát hành phiên bản Windows XP 64 bit, vài năm sau đó, bạn nên cân nhắc vì đây là phiên bản đầu tiên cần "ma thuật" này. –

+0

Ah ... giải thích nó. (Và vâng, xin lỗi tôi đã xóa phần Windows 2000 về bình luận của tôi ngay trước khi bạn đăng, vì tôi nhớ nó không có 64-bit.) Không phải câu trả lời tôi đang tìm kiếm, nhưng chắc chắn có vẻ đúng; cảm ơn! :) – Mehrdad

4

Bạn thực sự có thể có mã x64 trong tệp thực thi x86 nếu hệ thống có một lớp mô phỏng WOW64 (Windows Vista +, dunno về XP). http://vxheavens.com/lib/vrg02.html

Tôi đã thử nghiệm kỹ thuật này và nó hoạt động trên Win7 cũng như WinVista. Tôi đã viết một bài sơ khai trong việc lắp ráp để giải quyết việc nhập khẩu và tải lên một số mã C đã được biên dịch cho AMD64.

Microsoft chỉ nói rằng bạn không thể chuyển đổi qua lại vì chúng có thể thay đổi, nhưng tôi nghi ngờ điều này sẽ thay đổi cho đến khi kiến ​​trúc cơ bản thay đổi để cho phép thứ gì đó như 128 bit chạy ... WOW64 sẽ được xung quanh :), WOW128 ftl.

+1

+1 OMG thật tuyệt vời! : D cảm ơn vì đã chia sẻ nó! – Mehrdad

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