2012-07-29 10 views
14

Sau khi nâng cấp từ VS11 Beta lên VS2012 RC - Tôi đã sửa đổi từ nhắm mục tiêu .NET 4.0 thành .NET 4.5. Tôi nhận thấy trong app.config theo phầnThời gian chạy được hỗ trợ v4.0 trong app.config sau khi nâng cấp VS11 Beta lên VS2012 RC

<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
</startup> 

Điều trên là gì?

Khi tôi cố gắng tạo ra một dự án mới (không nâng cấp của dự án hiện có) từ bên trong VS2012 RC Tôi không thấy phần trên trong app.config

Trả lời

13

Đó là một tác dụng phụ của .NET phiên bản vĩnh cửu quagmire. .NET 4.5 không phải là một phiên bản side-by-side của .NET framework, nó hoàn toàn thay thế cài đặt .NET 4.0. Giống như 3.0 và 3.5 thay thế một cài đặt .NET 2.0.

Bản cập nhật 3.0 và 3.5 khá nhẹ, khung công tác chỉ thu được một loạt các hội đồng mới. CLR và các lớp cơ sở cốt lõi không thay đổi. Nhiều.

Tệp clr.dll được bao gồm trong phiên bản 4.5 của khung vẫn có số phiên bản 4.0.30319. Cùng một số phiên bản của phiên bản 4.0 của CLR. Và không có sự cố khi thực thi các ứng dụng .NET nhắm vào khung công tác .NET 4.0.

Phiên bản khung đó được sửa đổi rất nhiều nội bộ. Nó có được phép chiếu ngôn ngữ cho phép viết các ứng dụng Metro chạy trên Windows 8 bằng ngôn ngữ được quản lý. Những thay đổi nặng nề bao gồm việc di chuyển các lớp từ một assembly này sang assembly khác, cho phép triển khai trên điện thoại hoặc slate là khiêm tốn. Tệp app.exe.config được thêm vào dự án của bạn đảm bảo rằng người dùng của bạn có phiên bản được yêu cầu đó. Triển khai tệp .config là tùy chọn, nhưng người dùng sẽ thấy thông báo ngoại lệ khá mờ khi anh ta chỉ cài đặt .NET 4.0. Không thực sự chắc chắn những gì trông giống như. Việc cài đặt tự động được kích hoạt khi anh ta không có 4.5 có lẽ cũng không hoạt động.

+0

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

+0

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 –

+1

@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? –

9

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.