Làm cách nào để phát hiện phiên bản .NET Framework và gói dịch vụ nào được cài đặt?


289

Một câu hỏi tương tự đã được hỏi ở đây , nhưng nó dành riêng cho .NET 3.5. Cụ thể, tôi đang tìm kiếm những điều sau đây:

  1. Cách chính xác để xác định phiên bản .NET Framework và gói dịch vụ nào được cài đặt là gì?
  2. Có một danh sách các khóa registry có thể được sử dụng?
  3. Có bất kỳ sự phụ thuộc giữa các phiên bản Framework?

2
Câu hỏi này liên quan chặt chẽ đến stackoverflow.com/questions/198931/ và và stackoverflow.com/questions/182910/ trộm
Pascal Paradis

Vâng, đúng vậy. Tôi đã biết về cái đầu tiên (nó là cái tôi đề cập đến trong câu hỏi của tôi). Tôi không biết về người khác.
Scott Dorman

3
Tôi rất ấn tượng về cách câu hỏi này (bao gồm cả câu trả lời) và tất cả các câu hỏi liên quan chặt chẽ hoàn toàn bỏ qua sự hiện diện của các giá trị SKU - điều này thậm chí khác biệt giữa 4.5 và 4.5.1.
springy76

@ springy76, Lý do điều này không giải quyết được sự hiện diện của các giá trị SKU là vì, vì mục đích xác định phiên bản nào của Khung được cài đặt, chúng không liên quan. Câu hỏi mà bạn đề cập thực sự là cố gắng xác định xem ".NET 4.0.2" đã được cài đặt chưa. Vấn đề ở đây là không có .NET 4.0.2, đó là bản cập nhật (KB2544514), không phải là bản phát hành Framework hay gói dịch vụ. Bạn có thể xem bài viết này trên MSDN ( msdn.microsoft.com/en-us/l Library / hh925567 ( v = vs.110 ) .aspx ) để biết thêm thông tin về cách phát hiện bản cập nhật nào được cài đặt.
Scott Dorman

Câu trả lời:


365

Sổ đăng ký là cách chính thức để phát hiện nếu một phiên bản cụ thể của Khung được cài đặt.

nhập mô tả hình ảnh ở đây

Những khóa đăng ký nào là cần thiết thay đổi tùy thuộc vào phiên bản Framework mà bạn đang tìm kiếm:

Khóa đăng ký phiên bản khung
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Phần mềm \ Microsoft \ .NETFramework \ Chính sách \ v1.0 \ 3705 
1.1 HKLM \ Phần mềm \ Microsoft \ Cài đặt khung NET \ NDP \ v1.1.4322 \ Cài đặt 
2.0 HKLM \ Phần mềm \ Microsoft \ Cài đặt khung NET \ NDP \ v2.0.50727 \ Cài đặt 
3.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.0 \ Setup \ InstallSuccess 
3.5 HKLM \ Phần mềm \ Microsoft \ Cài đặt khung NET \ NDP \ v3.5 \ Cài đặt 
Hồ sơ khách hàng 4.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install
4.0 Hồ sơ đầy đủ HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install

Nói chung bạn đang tìm kiếm:

"Install"=dword:00000001

ngoại trừ .NET 1.0, trong đó giá trị là một chuỗi ( REG_SZ) chứ không phải là một số ( REG_DWORD).

Xác định cấp gói dịch vụ theo một mẫu tương tự:

Khóa đăng ký phiên bản khung
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Phần mềm \ Microsoft \ Thiết lập hoạt động \ Thành phần đã cài đặt \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Phiên bản 
1.0 [1] HKLM \ Software \ Microsoft \ Active Setup \ Các thành phần đã cài đặt \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Phiên bản 
1.1 HKLM \ Phần mềm \ Microsoft \ Cài đặt khung NET \ NDP \ v1.1.4322 \ SP 
2.0 HKLM \ Phần mềm \ Microsoft \ Cài đặt khung NET \ NDP \ v2.0.50727 \ SP 
3.0 HKLM \ Phần mềm \ Microsoft \ Cài đặt khung NET \ NDP \ v3.0 \ SP 
3.5 HKLM \ Phần mềm \ Microsoft \ Cài đặt khung NET \ NDP \ v3.5 \ SP 
Hồ sơ khách hàng 4.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Service
4.0 Hồ sơ đầy đủ HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Phục vụ

[1] Windows Media Center hoặc Windows XP Tablet Edition

Như bạn có thể thấy, việc xác định mức SP cho .NET 1.0 thay đổi nếu bạn đang chạy trên Windows Media Center hoặc Windows XP Tablet Edition. Một lần nữa, .NET 1.0 sử dụng một giá trị chuỗi trong khi tất cả những cái khác sử dụng DWORD.

Đối với .NET 1.0, giá trị chuỗi tại một trong hai khóa này có định dạng #, #, ####, #. Số cuối cùng là cấp Gói dịch vụ.

Mặc dù tôi không yêu cầu rõ ràng về điều này, nhưng nếu bạn muốn biết số phiên bản chính xác của Framework, bạn sẽ sử dụng các khóa đăng ký này:

Khóa đăng ký phiên bản khung
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Phần mềm \ Microsoft \ Thiết lập hoạt động \ Thành phần đã cài đặt \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Phiên bản 
1.0 [1] HKLM \ Software \ Microsoft \ Active Setup \ Các thành phần đã cài đặt \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Phiên bản 
1.1 HKLM \ Phần mềm \ Microsoft \ Cài đặt khung NET \ NDP \ v1.1.4322 
2.0 [2] HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Phiên bản 
2.0 [3] HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Tăng
3.0 HKLM \ Phần mềm \ Microsoft \ Cài đặt khung NET \ NDP \ v3.0 \ Phiên bản 
3.5 HKLM \ Phần mềm \ Microsoft \ Cài đặt khung NET \ NDP \ v3.5 \ Phiên bản 
Hồ sơ khách hàng 4.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 
4.0 Hồ sơ đầy đủ HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 

[1] Windows Media Center hoặc Windows XP Tablet Edition
[2] .NET 2.0 SP1
[3] Bản phát hành gốc .NET 2.0 (RTM)

Một lần nữa, .NET 1.0 sử dụng một giá trị chuỗi trong khi tất cả những cái khác sử dụng DWORD.

Ghi chú bổ sung

  • đối với .NET 1.0, giá trị chuỗi tại một trong hai khóa này có định dạng #,#,####,#. Các #,#,####phần của chuỗi là phiên bản khung.

  • Đối với .NET 1.1, chúng tôi sử dụng tên của khóa đăng ký, đại diện cho số phiên bản.

  • Cuối cùng, nếu bạn xem xét các phụ thuộc, .NET 3.0 bổ sung thêm chức năng cho .NET 2.0, vì vậy cả .NET 2.0 và .NET 3.0 đều phải được cài đặt để nói rằng .NET 3.0 đã được cài đặt. Tương tự, .NET 3.5 bổ sung thêm chức năng cho .NET 2.0 và .NET 3.0, vì vậy .NET 2.0, .NET 3.0 và .NET 3. tất cả nên đánh giá để được cài đặt để nói chính xác rằng .NET 3.5 đã được cài đặt.

  • .NET 4.0 cài đặt phiên bản mới của CLR (phiên bản CLR 4.0) có thể chạy song song với CLR 2.0.

Cập nhật cho .NET 4.5

Sẽ không có v4.5khóa trong sổ đăng ký nếu .NET 4.5 được cài đặt. Thay vào đó, bạn phải kiểm tra xem HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Fullkhóa có chứa giá trị được gọi không Release. Nếu giá trị này xuất hiện, .NET 4.5 được cài đặt, nếu không thì không. Thông tin chi tiết có thể được tìm thấy ở đâyở đây .


1
Điều này dường như không hoạt động cho .NET 1.1 trong Vista x64. Không có phím v1.1.x ở bất kỳ nơi nào có thể. Ý tưởng?
Chris Hynes

7
Các khóa cho .NET 4.0 không hoàn toàn chính xác. Tôi đang thấy các khóa này: HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install Thư mục v4.0 chỉ có một khóa , (Mặc định) với giá trị không dùng nữa.
RandomEngy

2
Bài đăng này không bao gồm 4.5 và 4.5 không được liệt kê trong sổ đăng ký mặc dù nó đã được cài đặt.
Klas Mellbourn

37
Man, không ai ở Microsoft nghĩ để thêm một chuyển đổi đảo ngược?
gnuchu

2
Đó là một trò đùa. Tôi không thể tin đó là sooooo ngu ngốc!
Alex Byrth

17

Có một câu trả lời chính thức của Microsoft cho câu hỏi này tại bài viết cơ sở kiến ​​thức sau:

ID bài viết: 318785 - Đánh giá lần cuối: ngày 7 tháng 11 năm 2008 - Sửa đổi: 20.1 Cách xác định phiên bản nào của .NET Framework được cài đặt và liệu các gói dịch vụ đã được áp dụng chưa

Thật không may, nó dường như không hoạt động, vì phiên bản mscorlib.dll trong thư mục 2.0 có phiên bản 2.0 và không có phiên bản mscorlib.dll trong các thư mục 3.0 hoặc 3.5 mặc dù đã cài đặt 3.5 SP1 ... tại sao câu trả lời chính thức của Microsoft sẽ bị thông tin sai như vậy?


2
+1 - Có vẻ như Microsoft có thể đã cập nhật trang đó vì ban đầu bạn đã liên kết với nó. Vì vậy, có vẻ như đó có thể là một trong những nguồn chính thức tốt nhất về vấn đề này.
jpierson

2
Nó chỉ tăng lên 4.0
user316117 14/11/13

16

Framework 4 beta cài đặt vào một khóa registry khác nhau.

using System;
using System.Collections.ObjectModel;
using Microsoft.Win32;

class Program
{
    static void Main(string[] args)
    {
        foreach(Version ver in InstalledDotNetVersions())
            Console.WriteLine(ver);

        Console.ReadKey();
    }


    public static Collection<Version> InstalledDotNetVersions()
    {
        Collection<Version> versions = new Collection<Version>();
        RegistryKey NDPKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP");
        if (NDPKey != null)
        {
            string[] subkeys = NDPKey.GetSubKeyNames();
            foreach (string subkey in subkeys)
            {
                GetDotNetVersion(NDPKey.OpenSubKey(subkey), subkey, versions);
                GetDotNetVersion(NDPKey.OpenSubKey(subkey).OpenSubKey("Client"), subkey, versions);
                GetDotNetVersion(NDPKey.OpenSubKey(subkey).OpenSubKey("Full"), subkey, versions);
            }
        }
        return versions;
    }

    private static void GetDotNetVersion(RegistryKey parentKey, string subVersionName, Collection<Version> versions)
    {
        if (parentKey != null)
        {
            string installed = Convert.ToString(parentKey.GetValue("Install"));
            if (installed == "1")
            {
                string version = Convert.ToString(parentKey.GetValue("Version"));
                if (string.IsNullOrEmpty(version))
                {
                    if (subVersionName.StartsWith("v"))
                        version = subVersionName.Substring(1);
                    else
                        version = subVersionName;
                }

                Version ver = new Version(version);

                if (!versions.Contains(ver))
                    versions.Add(ver);
            }
        }
    }
}

1
Thay đổi Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)để Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")tránh ngoại lệ bảo mật cho người dùng không phải quản trị viên.
Jon Lồng

Thật tuyệt, tôi đã sử dụng LinqPad và nó mang lại cho tôi kết quả hoàn hảo! share.linqpad.net/5cjihh.linq
user917170

Thật kỳ lạ khi bạn chia sẻ về các chi tiết nhỏ (như phiên bản gói dịch vụ nào được cài đặt) nhưng thông tin quan trọng hơn (nếu khung được cài đặt chỉ một phần hoặc hoàn toàn) bị bỏ qua bởi mã của bạn !! Thật sai lầm khi coi Khóa đăng ký "Máy khách" và "Đầy đủ" như thể chúng giống nhau. Nếu chỉ có khóa "Client" thoát ra, ví dụ System.Web sẽ không khả dụng. Thông tin quan trọng này cũng nên được trả về bởi mã của bạn! Nếu người dùng đã gỡ cài đặt ".NET Framework 4 Extended" trong Bảng điều khiển, sẽ có một số hội đồng bị thiếu.
Elmue

8

Tôi muốn phát hiện sự hiện diện của phiên bản .NET 4.5.2 được cài đặt trên hệ thống của mình và tôi không tìm thấy giải pháp nào tốt hơn Trình phát hiện phiên bản .NET của ASoft .

Ảnh chụp của công cụ này hiển thị các phiên bản .NET khác nhau:

Ảnh chụp của công cụ này hiển thị các phiên bản .NET khác nhau


7

Liệt kê các khóa con của HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP. Mỗi khoá con là một phiên bản .NET . Nó nên có Install=1giá trị nếu nó hiện diện trên máy, giá trị SP hiển thị gói dịch vụ và MSI=1giá trị nếu được cài đặt bằng MSI. (.NET 2.0 trên Windows Vista chẳng hạn, ví dụ cuối cùng, vì nó là một phần của HĐH.)


Tôi không tìm thấy khóa này trên máy của mình (XP Pro), nhưng tôi đã có khóa này: HKLM \ SOFTWARE \ Microsoft \ .NETFramework. Tuy nhiên, các giá trị khác nhau mà bạn mô tả không tồn tại đối với tôi.
Charlie

Bạn nên có khóa này nếu bạn đã cài đặt .NET 1.1 trở lên. Khóa bạn đã đề cập chỉ được sử dụng cho .NET 1.0.
Scott Dorman

reg truy vấn "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP"
nhiệt1ast

5

Đối với HĐH 64 bit, đường dẫn sẽ là:

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\

10
Điều này chỉ đúng "phần nào". Sổ đăng ký trong các phiên bản 64 bit của Windows được chia thành các khóa 32 bit và 64 bit (với nhiều khóa 32 bit có cùng tên với các khóa 64 bit). Khóa Wow6432Nodeđăng ký là một phần của bộ phản xạ đăng ký WOW64, phản ánh các khóa và giá trị nhất định giữa các chế độ xem đăng ký 64 bit và 32 bit. Không cần phải truy cập trực tiếp vào khóa này vì cơ quan đăng ký sẽ tự động xử lý chuyển hướng và phản chiếu.
Scott Dorman

5

Cập nhật cho .NET 4.5.1

Bây giờ .NET 4.5.1 đã có sẵn giá trị thực của khóa có tên Phát hành trong sổ đăng ký cần phải được kiểm tra, không chỉ là sự tồn tại của nó. Giá trị 378758 có nghĩa là .NET Framework 4.5.1 đã được cài đặt. Tuy nhiên, như được mô tả ở đây , giá trị này là 378675 trên Windows 8.1.


5

Có một công cụ GUI có sẵn, ASoft .NET Phiên bản phát hiện , luôn được chứng minh là rất đáng tin cậy. Nó có thể tạo các tệp XML bằng cách chỉ định tên tệp của đầu ra XML trên dòng lệnh.

Bạn có thể sử dụng điều này để tự động hóa. Đây là một chương trình nhỏ, được viết bằng ngôn ngữ không phụ thuộc .NET và không cần cài đặt.


4

Tôi cần tìm hiểu phiên bản .NET framework nào tôi có trên máy tính của mình và tất cả những gì tôi đã làm là vào bảng điều khiển và chọn tùy chọn "Gỡ cài đặt chương trình". Sau đó, tôi đã sắp xếp các chương trình theo tên và tìm thấy Hồ sơ khách hàng Microsoft .NET Framework 4.


1
Cảm ơn - Mọi "giải pháp" khác mà tôi đã thử đều thiếu sót và sẽ không hiệu quả. Điều này đã làm.
dùng20493

Lý do tôi tìm kiếm thông tin này là vì những thứ trong Gỡ cài đặt Chương trình hoàn toàn không đáng tin cậy, ít nhất là khi nói đến .NET Framework.
tobbenb3

3

Dưới đây là tập lệnh PowerShell để có được các phiên bản .NET framework đã cài đặt

function Get-KeyPropertyValue($key, $property)
{
    if($key.Property -contains $property)
    {
        Get-ItemProperty $key.PSPath -name $property | select -expand $property
    }
}

function Get-VersionName($key)
{
   $name = Get-KeyPropertyValue $key Version
   $sp = Get-KeyPropertyValue $key SP
   $install = Get-KeyPropertyValue $key Install
   if($sp)
   {
        "$($_.PSChildName) $name SP $sp"
   }
   else{
    "$($_.PSChildName) $name"
   }
}

function Get-FrameworkVersion{
   dir "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\" |? {$_.PSChildName -like "v*"} |%{
    if( $_.Property -contains "Version")
    {
        Get-VersionName $_
    }
    else{
        $parent = $_
        Get-ChildItem $_.PSPath |%{
            $versionName = Get-VersionName $_
            "$($parent.PSChildName) $versionName"
            }
        }
    }
}


$v4Directory = "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
if(Test-Path $v4Directory)
{
    $v4 = Get-Item $v4Directory
    $version = Get-KeyPropertyValue $v4 Release
    switch($version){
        378389 {".NET Framework 4.5"; break;}
        378675 {".NET Framework 4.5.1 installed with Windows 8.1 or Windows Server 2012 R2"; break;}
        378758 {".NET Framework 4.5.1 installed on Windows 8, Windows 7 SP1, or Windows Vista SP2"; break;}
        379893 {".NET Framework 4.5.2"; break;}
        { 393295, 393297 -contains $_} {".NET Framework 4.6"; break;}
        { 394254, 394271 -contains $_} {".NET Framework 4.6.1"; break;}
        { 394802, 394806 -contains $_} {".NET Framework 4.6.2"; break; }
    }
}

Nó được viết dựa trên Cách: Xác định Phiên bản .NET Framework nào được cài đặt . Vui lòng sử dụng hàm THE Get-FrameworkVersion () để nhận thông tin về các phiên bản .NET framework đã cài đặt.


2

Sử dụng thư viện Signum.Utilities từ SignumFramework (bạn có thể sử dụng độc lập), bạn có thể tự lấy nó một cách độc đáo và không phải tự mình xử lý sổ đăng ký:

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1

2
Nhìn vào mã cho phương thức này, nó không hoàn chỉnh cho đến khi sử dụng khóa đăng ký nào và sẽ hoàn toàn bỏ lỡ .NET 1.0 và không phân biệt giữa .NET 2.0 (RTM) và .NET 2.0 SP1. Nó cũng không tính đến sự phụ thuộc giữa các phiên bản khung.
Scott Dorman 17/03/2016

2
Không phải là một giải pháp tốt. Không có lý do chính đáng để tải xuống toàn bộ thư viện chỉ để có phiên bản .NET khi bạn có thể tự thực hiện công việc tương tự trong khoảng 3 dòng mã. Là một lập trình viên, bạn NÊN có thể "tự mình đối phó với cơ quan đăng ký".
TheSmurf

3
@DannySmurf Tôi không đồng ý. Khi .NET 3.0 được giới thiệu, MS nên đã gói nó trong API .NET (ngay khi chúng tôi có hơn một lớp FX trên cùng một CLR). Tôi muốn ứng dụng của mình sử dụng thư viện tiện ích, sau đó khi 4.1, 6.1, 7.100 xuất hiện, tôi chỉ có thể cập nhật thư viện và mục cấu hình cho lớp .NET mà ứng dụng của tôi yêu cầu. Tất nhiên, đối số này không giữ được nước nếu không có thư viện nào hoạt động.
yzorg


1

Trong Windows 7 (nó cũng hoạt động với Windows 8, nhưng tôi chưa thử nó):

Đi đến một dấu nhắc lệnh

Các bước để đi đến một dấu nhắc lệnh:

  1. Nhấp vào Bắt đầu Menu
  2. Trong Hộp Tìm kiếm, nhập "cmd" (không có dấu ngoặc kép)
  3. Mở cmd.exe

Trong cmd, gõ lệnh này

wmic /namespace:\\root\cimv2 path win32_product where "name like '%%.NET%%'" get version

Điều này cung cấp phiên bản mới nhất của NET Framework được cài đặt.

Người ta cũng có thể dùng thử Raymond.cc Utilties cho cùng.


1
Chạy dòng đó trong cmdcho tôi ERROR: Description = Invalid namespace.
MEMark

tôi cũng nhận đượcERROR: Description = Invalid namespace
Peter

Lệnh này cho tôi lỗi! (thực hiện từ thiết bị đầu cuối windows 7)
Smrita 17/1/2015

Cảm ơn MEMark, Peter, Smrita đã thông báo.
Mayank Agarwal
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.