Hangi .NET Framework sürümlerinin ve hizmet paketlerinin yüklü olduğunu nasıl belirleyebilirim?


289

Benzer bir soru sorulmuştur burada , ancak .NET 3.5 ile özgü idi. Özellikle, aşağıdakileri arıyorum:

  1. Hangi .NET Framework sürümlerinin ve hizmet paketlerinin yüklü olduğunu belirlemenin doğru yolu nedir?
  2. Kullanılabilecek kayıt defteri anahtarlarının bir listesi var mı?
  3. Framework sürümleri arasında herhangi bir bağımlılık var mı?


Evet öyle. İlkini zaten biliyordum (sorumda bahsettiğim kişi). Diğerini bilmiyordum.
Scott Dorman

3
Bu sorunun (cevaplar dahil) ve yakından ilişkili tüm soruların SKU değerlerinin varlığını tamamen görmezden geldiğinden etkilendim - bu 4.5 ve 4.5.1 arasında bile ayrım yapıyor.
springy76

@ springy76, Bunun SKU değerlerinin varlığına hitap etmemesinin nedeni, Çerçevenin hangi sürümlerinin yüklü olduğunu belirlemek amacıyla ilgili olmamalarıdır. Başvurduğunuz soru aslında ".NET 4.0.2" yüklü olup olmadığını belirlemeye çalışıyor. Buradaki sorun, .NET 4.0.2'nin olmaması, bir güncelleme (KB2544514), bir Çerçeve sürümü veya bir hizmet paketi olmamasıydı. Hangi güncelleştirmelerin yüklü olduğunu belirleme hakkında daha fazla bilgi için MSDN'deki bu makaleye ( msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx ) bakabilirsiniz .
Scott Dorman

Yanıtlar:


365

Kayıt defteri, Framework'ün belirli bir sürümünün yüklü olup olmadığını algılamanın resmi yoludur .

resim açıklamasını buraya girin

Hangi kayıt defteri anahtarlarının gerekli olduğu, aradığınız Framework sürümüne bağlı olarak değişir:

Çerçeve Sürümü Kayıt Defteri Anahtarı
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Yazılım \ Microsoft \ .NETFramework \ İlke \ v1.0 \ 3705 
1.1 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v1.1.4322 \ Yükle 
2.0 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v2.0.50727 \ Yükle 
3.0 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v3.0 \ Setup \ InstallSuccess 
3.5 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v3.5 \ Yükle 
4.0 İstemci Profili HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v4 \ İstemci \ Yükle
4.0 Tam Profil HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v4 \ Tam \ Yükle

Genellikle arıyorsunuz:

"Install"=dword:00000001

.NET 1.0 dışında, değer REG_SZbir sayı ( REG_DWORD) yerine bir dize ( ) 'dir.

Hizmet paketi düzeyini belirlemek benzer bir düzen izler:

Çerçeve Sürümü Kayıt Defteri Anahtarı
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Yazılım \ Microsoft \ Active Setup \ Kurulu Bileşenler \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Sürüm 
1.0 [1] HKLM \ Yazılım \ Microsoft \ Active Setup \ Kurulu Bileşenler \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Sürüm 
1.1 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v1.1.4322 \ SP 
2.0 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v2.0.50727 \ SP 
3.0 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v3.0 \ SP 
3.5 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v3.5 \ SP 
4.0 İstemci Profili HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v4 \ İstemci \ Hizmet
4.0 Tam Profil HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v4 \ Tam \ Hizmet

[1] Windows Media Center veya Windows XP Tablet Edition

Gördüğünüz gibi, Windows Media Center veya Windows XP Tablet Edition üzerinde çalışıyorsanız .NET 1.0 için SP düzeyini belirlemek değişir. Yine, .NET 1.0 bir dize değeri kullanırken diğerlerinin tümü bir DWORD kullanır.

.NET 1.0 için bu anahtarlardan herhangi birinin dize değeri #, #, ####, # biçimindedir. Son #, Hizmet Paketi düzeyidir.

Ben açıkça sormadım, ancak Framework'ün tam sürüm numarasını bilmek istiyorsanız, bu kayıt defteri anahtarlarını kullanırsınız:

Çerçeve Sürümü Kayıt Defteri Anahtarı
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Yazılım \ Microsoft \ Active Setup \ Kurulu Bileşenler \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Sürüm 
1.0 [1] HKLM \ Yazılım \ Microsoft \ Active Setup \ Kurulu Bileşenler \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Sürüm 
1.1 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v1.1.4322 
2.0 [2] HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v2.0.50727 \ Sürüm 
2.0 [3] HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v2.0.50727 \ Artış
3.0 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v3.0 \ Sürüm 
3.5 HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v3.5 \ Sürüm 
4.0 İstemci Profili HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v4 \ Sürüm 
4.0 Tam Profil HKLM \ Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v4 \ Sürüm 

[1] Windows Media Center veya Windows XP Tablet Edition
[2] .NET 2.0 SP1
[3] .NET 2.0 Orijinal Sürümü (RTM)

Yine, .NET 1.0 bir dize değeri kullanırken diğerlerinin tümü bir DWORD kullanır.

ek Notlar

  • .NET 1.0 için bu anahtarlardan herhangi birinin dize değeri biçimindedir #,#,####,#. #,#,####Dize bölümü Çerçeve versiyonudur.

  • .NET 1.1 için, sürüm numarasını temsil eden kayıt defteri anahtarının adını kullanırız.

  • Son olarak, bağımlılıklara bakarsanız, .NET 3.0, .NET 2.0'a ek işlevsellik ekler, böylece .NET 2.0'ın ve .NET 3.0'ın her ikisi de yüklü olarak değerlendirilmelidir. Benzer şekilde, .NET 3.5, .NET 2.0 ve .NET 3.0'a ek işlevsellik ekler, bu nedenle .NET 2.0, .NET 3.0 ve .NET 3'ün tümü, .NET 3.5'in yüklü olduğunu doğru şekilde söylemek için yüklendiğini değerlendirmelidir.

  • .NET 4.0, CLR 2.0 ile yan yana çalışabilecek yeni bir CLR sürümü (CLR sürüm 4.0) yükler.

.NET 4.5 Güncelleştirmesi

v4.5.NET 4.5 yüklüyse kayıt defterinde bir anahtar olmayacaktır . Bunun yerine HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Fullanahtarın adlı bir değer içerip içermediğini kontrol etmeniz gerekir Release. Bu değer varsa, .NET 4.5 yüklenir, aksi takdirde yüklenmez. Daha fazla ayrıntıyı burada ve burada bulabilirsiniz .


1
Vista x64 altında .NET 1.1 için geçerli görünmüyor. Olası yerlerden hiçbirinde v1.1.x anahtarı yok. Fikirler?
Chris Hynes

7
.NET 4.0 anahtarları tam olarak doğru değil. Bu anahtarları görüyorum: HKLM \ Software \ Microsoft \ NET Framework Kurulumu \ NDP \ v4 \ Client \ Install HKLM \ Software \ Microsoft \ NET Framework Kurulumu \ NDP \ v4 \ Full \ Install v4.0 klasöründe yalnızca bir anahtar var , (Varsayılan) değeri kullanımdan kaldırıldı.
RandomEngy

2
Bu gönderi 4.5'i kapsamaz ve yüklü olmasına rağmen 4.5 kayıt defterinde listelenmez.
Klas Mellbourn

37
Dostum, Microsoft'ta hiç kimse bir -version anahtarı eklemeyi düşünmedi mi?
gnuchu

2
Bu bir şaka. Sooooo aptal olduğuna inanamıyorum!
Alex Byrth

17

Aşağıdaki bilgi tabanı makalesinde bu sorunun resmi bir Microsoft yanıtı bulunmaktadır:

Makale numarası: 318785 - Son gözden geçirme: 7 Kasım 2008 - Düzeltme: 20.1 Hangi .NET Framework sürümlerinin yüklü olduğu ve hizmet paketlerinin uygulanıp uygulanmadığı nasıl belirlenir

Ne yazık ki, 2.0 dizinindeki mscorlib.dll sürümü 2.0 sürümü olduğundan ve 3.5 SP1 yüklü olsa da 3.0 veya 3.5 dizinlerinde mscorlib.dll sürümü olmadığından işe yaramaz gibi görünüyor ... neden resmi Microsoft yanıtı bu kadar yanlış bilgilendirilir mi?


2
+1 - Görünüşe göre Microsoft, başlangıçta bağlandığınızdan bu sayfayı güncellemiş olabilir. Yani bu konudaki en iyi resmi kaynaklardan biri olabilir gibi görünüyor.
jpierson

2
Sadece
4.0'a

16

Framework 4 beta sürümü farklı bir kayıt defteri anahtarına yüklenir.

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
Yönetici olmayan kullanıcılar için bir güvenlik istisnasından kaçınmak Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)için Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")olarak değiştirin .
Jon Cage

Harika, LinqPad kullandım ve bana mükemmel sonuçlar verdi! share.linqpad.net/5cjihh.linq
user917170

Küçük ayrıntıları (hangi hizmet paketi sürümünün yüklü olduğu gibi) paylaşmanız gariptir, ancak daha önemli bilgiler (çerçeve yalnızca kısmen veya tamamen yüklenmişse) kodunuz tarafından yok sayılır !! Kayıt Defteri Anahtarlarına "İstemci" ve "Tam" gibi davranıyormuş gibi davranmak yanlıştır. Yalnızca "Client" anahtarı çıkarsa, örneğin System.Web kullanılamaz. Bu önemli bilgiler de kodunuz tarafından döndürülmelidir! Kullanıcı, Denetim Masası'ndaki ".NET Framework 4 Extended" uygulamasını kaldırdıysa, birkaç derleme eksik olacaktır.
Elmue


7

Öğesinin alt anahtarlarını numaralandırın HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP. Her alt anahtar bir .NET sürümüdür. Bu olması gereken Install=1bu makinede mevcut ise, bir SP değeri değeri olduğunu gösterir hizmet paketi ve bir MSI=1o bir MSI kullanılarak kurulduysa, değer. (Windows Vista'daki .NET 2.0, örneğin işletim sisteminin bir parçası olduğu için sonuncusuna sahip değildir.)


Bu anahtarı makinemde (XP Pro) bulamadım, ancak şunu buldum: HKLM \ SOFTWARE \ Microsoft \ .NETFramework. Ancak tarif ettiğiniz çeşitli değerler benim için mevcut değil.
Charlie

.NET 1.1 veya sonraki bir sürümü yüklüyse bu anahtara sahip olmalısınız. Bahsettiğiniz anahtar yalnızca .NET 1.0 için kullanıldı.
Scott Dorman

reg sorgusu "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Kurulumu \ NDP"
enthus1ast

5

64 bit işletim sistemi için yol şöyle olacaktır:

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

10
Bu sadece "biraz" doğrudur. Windows'un 64 bit sürümlerindeki kayıt defteri 32 bit ve 64 bit anahtarlara bölünmüştür (32 bit anahtarların çoğu 64 bit anahtarlarla aynı ada sahiptir). Wow6432NodeKayıt anahtarı WOW64'nı kayıt reflektör, bir parçası olan aynalar 64 bit ve 32-bit kayıt görünümleri arasında belirli anahtarları ve değerleri. Kayıt defteri yeniden yönlendirmeyi ve yansıtmayı otomatik olarak gerçekleştirdiğinden, bu anahtara doğrudan erişmeye gerek yoktur.
Scott Dorman

5

.NET 4.5.1 Güncelleştirmesi

.NET 4.5.1 kullanılabilir olduğuna göre, yalnızca varlığının değil, kayıt defterindeki Release adındaki anahtarın gerçek değerinin denetlenmesi gerekir. 378758 değeri .NET Framework 4.5.1'in yüklü olduğu anlamına gelir. Ancak, burada açıklandığı gibi, bu değer Windows 8.1'de 378675'tir.


5

Bir GUI aracı var, ASoft .NET Sürüm Dedektörü zaman son derece güvenilir olduğu kanıtlanmış vardır. Komut satırındaki XML çıktısının dosya adını belirterek XML dosyaları oluşturabilir.

Bunu otomasyon için kullanabilirsiniz. NET'e bağımlı olmayan bir dilde yazılmış ve kurulum gerektirmeyen küçük bir programdır.


4

Bilgisayarımda hangi .NET framework sürümünün bulunduğunu öğrenmem gerekiyordu ve tüm yaptığım kontrol paneline gidip "Program Kaldır" seçeneğini seçmekti. Bundan sonra programları ada göre sıraladım ve Microsoft .NET Framework 4 İstemci Profili'ni buldum.


1
Teşekkürler - Denediğim her "çözüm" kusurluydu ve işe yaramazdı. Bu oldu.
user20493

Bu bilgiyi aramamın nedeni, en azından .NET Framework söz konusu olduğunda, bir Programı Kaldır altındaki öğelerin tamamen güvenilmez olmasıdır.
tobbenb3

3

Kurulu .NET framework sürümlerini elde etmek için bir PowerShell betiği

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; }
    }
}

Nasıl Yapılır: Hangi .NET Framework Sürümlerinin Yüklü Olduğunu Belirleme temel alınarak yazılmıştır . Yüklü .NET framework sürümleri hakkında bilgi almak için lütfen Get-FrameworkVersion () işlevini kullanın.


2

SignumFramework (tek başına kullanabileceğiniz) Signum.Utilities kitaplığını kullanarak, güzel ve kayıt defteri ile kendiniz uğraşmadan alabilirsiniz:

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

2
Bu yöntemin koduna bakıldığında, hangi kayıt defteri anahtarlarını kullandığı kadar tam değildir ve .NET 1.0'ı tamamen özleyecek ve .NET 2.0 (RTM) ve .NET 2.0 SP1'i ayırt etmeyecektir. Ayrıca çerçeve sürümleri arasındaki bağımlılıkları da dikkate almaz.
Scott Dorman

2
İyi bir çözüm değil. Aynı işi yaklaşık 3 satırlık kodda yapabildiğinizde sadece .NET sürümünü almak için bir kütüphanenin tamamını indirmenin iyi bir nedeni yoktur. Bir programcı olarak, "kayıt defteri ile başa çıkmak" gerekir.
TheSmurf

3
@DannySmurf Kabul etmiyorum. .NET 3.0 piyasaya sürüldüğünde, MS bunu bir .NET API'sine (aynı CLR'de birden fazla FX katmanına sahip olur olmaz) tamamlamış olmalıdır. Uygulamamın bir yardımcı program kütüphanesi kullanmasını tercih ederim, daha sonra 4.1, 6.1, 7.100 geldiğinde, kitaplığı ve uygulamanızın gerektirdiği .NET katmanı için bir yapılandırma girişini güncelleyebilirim. Tabii ki kütüphanelerden hiçbiri işe yaramazsa bu argüman su tutmaz.
yzorg


1

Windows 7'de (Windows 8 için de çalışmalıdır, ancak test etmedim):

Komut istemine git

Komut istemine gitme adımları:

  1. Başlat Menüsü'nü tıklayın
  2. Arama kutusuna "cmd" yazın (tırnak işaretleri olmadan)
  3. Cmd.exe dosyasını açın

Cmd'ye bu komutu yazın

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

Bu, yüklü NET Framework'ün en son sürümünü verir.

Aynı şey Raymond.cc Utilties de deneyebilirsiniz .


1
O çizgiyi içeri cmdsokmak bana veriyor ERROR: Description = Invalid namespace.
MEMark

Ben de ERROR: Description = Invalid namespace
Peter

Bu komut bana hata veriyor! (Windows 7 terminalinden yürütülür)
Smrita

Teşekkür ederim MEMark, Peter, Smrita haber verdiğin için.
Mayank Agarwal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.