2013-04-22 37 views
8

Tôi có một câu hỏi nhanh: Khi tôi đi đến HELP-> About in Visual Studio 2012, cửa sổ chỉ ra rằng phiên bản .NET tôi đang sử dụng là 4.5.50709. Tuy nhiên, khi tôi thực thi mã sau:System.Environment.Version cung cấp một giá trị không chính xác

Console.WriteLine(Environment.Version); 

Tôi nhận phiên bản 4.0.30319.18034. Đưa cái gì? Trong số Pro C# 5 & .NET 4.5 Framework của Troelsen, trên trang 81 nó cho biết thuộc tính Phiên bản trả về một đối tượng đại diện cho phiên bản nền tảng .NET. Điều này có đúng không? Chuỗi cho câu hỏi trước đó cho biết rằng thuộc tính này trả về phiên bản CLR. Nếu đây là trường hợp, mục đích của đối tượng Phiên bản (như trong, việc sử dụng việc biết phiên bản CLR như trái ngược với phiên bản khung công tác) là gì, và làm cách nào để bạn thực sự có được phiên bản khung công tác?

Trả lời

17

Phiên bản CLR (Ngôn ngữ chung) là 4.0.30319.18034. Nó bắt đầu với 4.0.30319 vì .NET 4.5 là một bản nâng cấp tại chỗ của các hội đồng .NET 4.0.

Bản cập nhật 4.5 hoàn toàn thay thế thời gian chạy .NET 4.0 và để lại số phiên bản thực tế được đặt tại v4.0.30319.

(source 1, source 2)

Nhưng số phiên bản của bạn có thể đại diện cho .NET 4.5 với một số thông tin cập nhật, như có thể được rút ra từ this list của thành viên Daniel:

Dưới đây là một số ví dụ các phiên bản thời gian chạy mà tôi đã xem:

  • 4.0.30319.1 = .NE T 4,0 RTM
  • 4.0.30319.269 = phổ biến nhất phiên bản .NET 4.0 chúng ta đang thấy trong các dữ liệu thu thập được từ người dùng của chúng tôi
  • 4.0.30319.544 = một phiên bản .NET 4.0 rằng một phần nhỏ người dùng của chúng tôi đã cài đặt
  • 4.0.30319.17626 = NET 4.5 RC
  • 4.0.30319.17929 = NET 4.5 RTM
  • 4.0.30319.18010 = phiên bản hiện tại trên máy tính Windows 8 của tôi

Các lớn, nhỏ và xây dựng versi về số lượng không thay đổi, vì vậy tôi nghĩ họ không nghĩ rằng sự khác biệt giữa .NET 4.0 và 4.5 sẽ đủ lớn để quan trọng đối với hầu hết mọi người. Các ứng dụng cho .NET 4.0 mong đợi một số phiên bản 4.0.30319 vẫn hoạt động như mong đợi trong .NET 4.5.


Cho dù bạn mã cho .NET 4.0 hoặc 4.5, bạn đang biên dịch dựa trên cùng một cụm .NET. Sự khác biệt duy nhất là một số lớp mới từ .NET 4.5 được ẩn khi biên dịch dựa trên .NET 4.0 (như thể chúng chưa bao giờ tồn tại). Vì vậy, cách duy nhất đáng tin cậy để biết sự khác biệt giữa .NET 4.0 và 4.5 dường như là cách tiếp cận khá hackish bởi Christian.K in his post đề xuất, điều đó không liên quan đến số phiên bản:

Lớp ReflectionContext có vẻ là hoàn toàn mới với khung công tác .NET 4.5 và sống thuận tiện trong mscorlib.Vì vậy, bạn có thể làm một cái gì đó như thế này.

public static bool IsNet45OrNewer() 
{ 
    // Class "ReflectionContext" exists from .NET 4.5 onwards. 
    return Type.GetType("System.Reflection.ReflectionContext", false) != null; 
} 
+0

Điều đó có ý nghĩa, nhưng có một thuộc tính thực sự trả về phiên bản .NET trái với phiên bản CLR không? Và trong trường hợp nào bạn sẽ cần phải biết phiên bản CLR như trái ngược với phiên bản khung chính nó? –

+0

@VincentAlegrete Tôi đã cập nhật bài đăng của mình. – Virtlink

+0

Điều tương tự cũng xảy ra với 2.0 - 3.5, tất cả đều là 2.0 của CLR. –

2

Cũng giống như một bài tập tôi đã tự hỏi như thế nào Visual Studio lấy phiên bản .NET. Bạn có thể truy vấn sổ đăng ký để xem phiên bản nào được cài đặt và tôi đã đưa ra mã này:

static void Main(string[] args) 
{ 
    Console.WriteLine("The following .NET versions are installed:"); 
    var vers = SearchRegistry(Registry.LocalMachine, "Software\\Microsoft\\NET Framework Setup\\NDP", "Version") 
     .GroupBy(v => v) 
     .Select(v => (string)v.Key) 
     .OrderBy(s => s); 

    foreach (string s in vers) 
     Console.WriteLine(s); 

    Console.WriteLine(string.Format("Newest Installed .NET version: {0}", vers.Last())); 
} 

private static IEnumerable<object> SearchRegistry(RegistryKey root, string subkey, string search) 
{ 
    foreach (string sub in root.OpenSubKey(subkey).GetSubKeyNames()) 
    { 
     foreach (string val in root.OpenSubKey(subkey).OpenSubKey(sub).GetValueNames()) 
      if (val == search) 
       yield return root.OpenSubKey(subkey).OpenSubKey(sub).GetValue(val); 

     foreach (var o in SearchRegistry(root.OpenSubKey(subkey), sub, search)) 
      yield return o; 
    } 
} 
Các vấn đề liên quan