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
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 đó.