Có thể chạy ứng dụng .NET 4.5 trên XP không?


86

Đầu tiên, tôi đã đọc những điều sau:

Vì vậy, từ gạch đầu dòng cuối cùng, tôi thực sự nghĩ rằng không có cách nào để giải quyết vấn đề này, nhưng tôi phải xem liệu tôi có thể nhận được câu trả lời chính xác hay không vì nhóm của tôi muốn nâng cấp từ .NET 4.0 lên .NET 4.5. Tuy nhiên, chúng tôi phải hỗ trợ XP.

Không có khả năng chuyển sang .NET 4.5 nếu chúng ta muốn hỗ trợ XP?

Điều duy nhất tôi có thể nghĩ đến là tạo ra hai giải pháp riêng biệt, nhưng sau đó các cơ sở mã sẽ phải khác nhau nếu chúng tôi sử dụng các tính năng .NET 4.5.

Vì vậy, tôi đang tìm kiếm một số giải pháp tuyệt vời mà tôi không thể tìm thấy và những người khác có thể đã biết.


9
Không, bạn không thể. Hãy gắn bó với 4.0 cho đến khi XP chết chắc chắn.
Federico Berasategui

Câu trả lời:


188

Tôi ngần ngại đăng câu trả lời này, nó thực sự có thể về mặt kỹ thuật nhưng nó không hoạt động tốt trong thực tế. Số phiên bản của CLR và các tổ hợp khung cốt lõi không thay đổi trong 4.5. Bạn vẫn nhắm mục tiêu v4.0.30319 của CLR và số phiên bản lắp ráp khung vẫn là 4.0.0.0. Điều duy nhất đặc biệt về tệp kê khai hợp ngữ khi bạn nhìn vào nó bằng một trình tháo gỡ như ildasm.exe là sự hiện diện của thuộc tính [TargetFramework] nói rằng cần có 4.5, điều đó sẽ phải được thay đổi. Không thực sự dễ dàng như vậy, nó được phát ra bởi trình biên dịch.

Sự khác biệt lớn nhất là không thể nhìn thấy được, Microsoft đã thực hiện một thay đổi quá hạn lâu dài trong tiêu đề thực thi của các hội đồng. Nó chỉ định phiên bản Windows mà tệp thực thi tương thích với. XP thuộc thế hệ Windows trước, bắt đầu với Windows 2000. Số phiên bản chính của chúng là 5. Vista là phiên bản bắt đầu của thế hệ hiện tại, phiên bản chính số 6.

Các trình biên dịch .NET luôn chỉ định số phiên bản tối thiểu là 4.00, phiên bản của Windows NT và Windows 9x. Bạn có thể thấy điều này bằng cách chạy dumpbin.exe / headers trên assembly. Đầu ra mẫu trông như thế này:

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            ...
            4.00 operating system version
            0.00 image version
            4.00 subsystem version              // <=== here!!
               0 Win32 version
            ...

Điểm mới trong .NET 4.5 là trình biên dịch thay đổi phiên bản hệ thống con đó thành 6.00. Một thay đổi quá hạn phần lớn là do Windows chú ý đến con số đó, ngoài việc chỉ kiểm tra xem nó có đủ nhỏ hay không. Nó cũng bật các tính năng của appcompat vì nó giả định rằng chương trình được viết để hoạt động trên các phiên bản Windows cũ. Những tính năng này gây ra rắc rối, đặc biệt là cách Windows nằm ngang với kích thước của một cửa sổ trong Aero rất rắc rối. Nó ngừng nói về các đường viền béo của một cửa sổ Aero khi nó có thể thấy rằng chương trình được thiết kế để chạy trên phiên bản Windows có Aero.

Bạn có thể thay đổi số phiên bản đó và đặt nó trở lại 4.00 bằng cách chạy Editbin.exe trên các tổ hợp của bạn với tùy chọn / hệ thống con. Câu trả lời này hiển thị một sự kiện postbuild mẫu.

Tuy nhiên, đó là nơi mà tin tốt kết thúc, một vấn đề quan trọng là .NET 4.5 không tương thích với .NET 4.0. Cho đến nay, vấn đề lớn nhất là các lớp được chuyển từ tổ hợp này sang tổ hợp khác. Đáng chú ý nhất, điều đó đã xảy ra đối với thuộc tính [Phần mở rộng]. Trước đây trong System.Core.dll, nó đã được chuyển sang Mscorlib.dll trong .NET 4.5. Đó là một lỗi trên XP nếu bạn khai báo các phương thức mở rộng của riêng mình, chương trình của bạn nói rằng hãy tìm thuộc tính Mscorlib, được kích hoạt bởi thuộc tính [TypeForwardedTo] trong phiên bản .NET 4.5 của cụm tham chiếu System.Core. Nhưng nó không có ở đó khi bạn chạy chương trình của mình trên .NET 4.0

Và tất nhiên không có gì có thể giúp bạn ngừng sử dụng các lớp và phương thức chỉ có trên .NET 4.5. Khi bạn làm vậy, chương trình của bạn sẽ không thành công với TypeLoadException hoặc MissingMethodException khi chạy trên 4.0

Chỉ cần nhắm mục tiêu 4.0 và tất cả những vấn đề này biến mất. Hoặc phá vỡ nhật ký đó và ngừng hỗ trợ XP, một quyết định kinh doanh mà các lập trình viên thường không thể đưa ra nhưng chắc chắn có thể khuyến khích bằng cách chỉ ra những phức tạp mà nó đang gây ra. Tất nhiên, việc phải hỗ trợ các hệ điều hành cổ xưa sẽ phải trả một khoản chi phí khác, chỉ cần nỗ lực thử nghiệm là đáng kể. Một chi phí thường không được ban quản lý công nhận, khả năng tương thích với Windows là huyền thoại, trừ khi nó được chỉ ra cho họ. Chuyển tiếp chi phí đó cho khách hàng và họ có xu hướng đưa ra quyết định đúng nhanh hơn rất nhiều :) Nhưng chúng tôi không thể giúp bạn điều đó.


2
Cảm ơn Hans, tôi nhận ra rằng đã có một số thay đổi đột phá. Tôi cũng đánh giá cao cách giải quyết. Chúng tôi không thể đi theo nó vì những lý do bạn đã chỉ định, nhưng thật tốt khi biết. Có lẽ XP sẽ biến mất cho một ngày nào đó tốt ....
Justin Pihony

3
just the testing effort is substantial- đó là những gì đã quản lý của chúng tôi để "cho phép bỏ hỗ trợ XP".
Christoph Fink

Tôi biết đây là một bài đăng cũ - nhưng - @JustinPihony: Công ty của bạn đã bao giờ nghĩ đến việc cài đặt một hệ điều hành mới hơn và sau đó cài đặt VMWare hoặc Virtual Box chưa? Có một chút muộn đối với Windows 7 - nhưng Microsoft đã cung cấp một bản cài đặt Windows XP ảo cho phép bạn chuyển đổi giữa 7 và XP. Chỉ là một suy nghĩ. :-)
Mark Manning

@MarkManning nó không nằm trong tầm kiểm soát của chúng tôi. Nó đã được sử dụng ở những nơi khác.
Justin Pihony,

1
@JustinPihony: À. Hmmmmm ...... Đề nghị duy nhất của tôi là một kluge. Chụp phiên bản hệ điều hành và sau đó chỉ cần thiết lập tất cả các hàm trong các lớp của bạn để đưa vào các mảng (hoặc một mảng). Có một mảng (hoặc một phần của mảng) dành cho XP và mảng kia dành cho hệ điều hành mới hơn. Sau đó, tất cả những gì bạn cần là một số loại biến toàn cục được sử dụng để biểu thị bộ nào sẽ sử dụng. Tất cả các lệnh gọi có thể giống nhau (hoặc trông giống nhau) nhưng một bộ sử dụng NET40_ <FUNCTION> và các bộ khác có thể sử dụng NET45_ <FUNCTION>. Đây sẽ là một lời gọi gián tiếp đến chính hàm. Điều đó có ý nghĩa?
Mark Manning

21

Đáng buồn là không, bạn không thể chạy 4,5 chương trình trên XP.

Và bài đăng có liên quan từ trang Kết nối đó:

Được đăng bởi Microsoft vào 23/03/2012 lúc 10:39
Cảm ơn bạn đã báo cáo. Hành vi này là do thiết kế trong .NET Framework 4.5 Beta. Hệ điều hành được hỗ trợ tối thiểu là Windows 7, Windows Server 2008 SP2 và Windows Server 2008 R2 SP1. Windows XP không phải là hệ điều hành được hỗ trợ cho bản phát hành Beta.


8

Dự án Mono bỏ hỗ trợ Windows XP và "quên" đề cập đến nó. Mặc dù họ vẫn khẳng định Windows XP SP2 là phiên bản được hỗ trợ tối thiểu, nhưng thực chất nó là Windows Vista.

Phiên bản cuối cùng của Mono hỗ trợ Windows XP là 3.2.3.


7

Hãy thử mono:

http://www.go-mono.com/mono-downloads/download.html

Bản tải xuống này hoạt động trên tất cả các phiên bản Windows XP, 2003, Vista và Windows 7.


2
Mono chậm hơn .NET và trong khi có hầu hết các tính năng của .NET 4.5, nó thiếu một số thành phần chính như WPF ( mono-project.com/Compatibility ). Vì vậy, bạn có thể sử dụng hỗ trợ Mono cho XP nếu nó cung cấp tất cả những gì bạn cần và bạn đồng ý với các tác động về hiệu suất. Mặt tích cực, không cần tạo một "bản dựng Mono" đặc biệt, bản dựng .NET 4.5 thông thường thường hoạt động theo Mono, nhưng bạn cần phải kiểm tra cụ thể với Mono để đảm bảo bạn tương thích.
Qwertie

2
Tôi đã thử mono-3.12.1-gtksharp-2.12.26-win32-0.msi trong Windows XP SP3 và nó không thành công với "mono.exe không phải là ứng dụng Win32 hợp lệ" . Tôi cũng đã thử mono-3.0.10-gtksharp-2.12.11-win32-0.exe không thành công với "mono.exe - Entry Point Not Found. Không thể tìm thấy điểm nhập thủ tục InterlockedCompareExchange64 trong thư viện liên kết động KERNEL32 .dll ” .
Cristian Ciupitu

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.