Trong khi Hans Passant là chính xác trong tất cả mọi thứ ông nói ông bỏ lỡ một điểm quan trọng đó là vai trò của tiêu đề PE trong thất bại này.
Vì Dotnet 4.5 là một cài đặt tại chỗ trên đỉnh DotNet 4.0, và vì nó không cập nhật số phiên bản Dotnet, kết quả là các tệp nhị phân được tạo bằng Dotnet 4.5 có số phiên bản Dotnet 4.0 cũ tiêu đề PE nhị phân (4.0.30319).
Vì CLR sử dụng giá trị này trong tiêu đề PE để xác định phiên bản nào của khung Dotnet để tải và vì giá trị này không thay đổi đối với các hội đồng được xây dựng dựa trên Dotnet 4.5, khi không có thêm thông tin nào không có cách nào để biết liệu một assembly với 4.0.30319 trong tiêu đề PE có yêu cầu liên kết tới Dotnet 4.0 hay 4.5 hay không.
Đó là sự hiện diện của phần tử supportedRuntime trong app.config cung cấp thông tin bổ sung này cho CLR. Vì vậy, nếu bạn khởi động ứng dụng Dotnet 4.5 với mục nhập SupportRuntime hiện tại trên một hệ thống chỉ có cài đặt DotNet 4.0, thì CLR sẽ bật lên một thông báo hữu ích thông báo cho bạn rằng bạn không cài đặt phiên bản Dotnet yêu cầu. Trong khi nếu bạn khởi chạy cùng một ứng dụng Dotnet 4.5 mà không cần mục nhập SupportRuntime trên hệ thống chỉ có cài đặt DotNet 4.0, thì ứng dụng có thể bắt đầu chạy, nhưng sau đó sẽ gặp sự cố khi sử dụng tính năng Dotnet 4.5 sau này.
Trong khi các dự án được xây dựng bằng cách sử dụng VS2012 RC và nhắm mục tiêu Dotnet 4.5 có thể có mục nhập SupportRuntime bị thiếu, dự án được xây dựng bằng cách sử dụng VS2012 RTM có mục nhập.
vì vậy khi người dùng có .NET 4.0, nó sẽ hiển thị lỗi nói .NET 4.5 là bắt buộc với cấu hình đó. Nếu cấu hình đó không có thì sao?Sẽ không phải là cũng ném lỗi anyway kể từ khi tôi đã nhắm mục tiêu. NET 4.5? – friend
Có, nhưng đó là một khó khăn hơn rất nhiều để giải thích. Giống như MissingMethodException hoặc FileNotFoundException, không phải là một thông báo thân thiện như "Bạn không có .NET 4.5, bạn có muốn tôi cài đặt nó cho bạn không?" Xem http://stackoverflow.com/a/10033128/17034 –
@nobugz, tôi luôn hơi bối rối về phiên bản .NET mà tôi cần để cung cấp cùng với ứng dụng của mình. Dựa trên nhận xét của bạn ở trên, tôi có hiểu rằng các ứng dụng nhắm mục tiêu .NET 4.5 ** chỉ ** phải tạo .NET 4.5? Nói cách khác, tôi không phải lo lắng nếu .NET 3.5, 3.0, vv có trên hệ thống không? –