Bagaimana cara mendeteksi versi dan paket layanan .NET Framework yang diinstal?

289

Pertanyaan serupa ditanyakan di sini , tetapi khusus untuk .NET 3.5. Secara khusus, saya mencari yang berikut:

  1. Apa cara yang benar untuk menentukan versi dan paket layanan .NET Framework yang diinstal?
  2. Apakah ada daftar kunci registri yang dapat digunakan?
  3. Apakah ada ketergantungan antara versi Kerangka?
Scott Dorman
sumber
2
Pertanyaan ini terkait erat dengan stackoverflow.com/questions/198931/… dan stackoverflow.com/questions/182910/…
Pascal Paradis
Ya itu. Saya sudah tahu tentang yang pertama (itu yang saya rujuk dalam pertanyaan saya). Saya tidak tahu tentang yang lain.
Scott Dorman
3
Saya terkesan bagaimana pertanyaan ini (termasuk jawaban) dan semua pertanyaan yang berhubungan erat mengabaikan sepenuhnya nilai - nilai SKU - ini bahkan membedakan antara 4,5 dan 4.5.1.
springy76
@ springy76, Alasan ini tidak membahas keberadaan nilai SKU adalah karena, untuk tujuan menentukan versi Kerangka mana yang diinstal, mereka tidak relevan. Pertanyaan yang Anda rujuk sebenarnya mencoba untuk menentukan apakah ". NET 4.0.2" diinstal. Masalahnya di sini adalah bahwa tidak ada. NET 4.0.2, itu adalah pembaruan (KB2544514), bukan rilis Framework atau paket layanan. Anda dapat melihat artikel ini di MSDN ( msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx ) untuk informasi lebih lanjut tentang cara mendeteksi pembaruan mana yang diinstal.
Scott Dorman
Di sini Anda telah Periksa versi .net ...
DanielV

Jawaban:

365

Registri adalah cara resmi untuk mendeteksi jika versi spesifik dari Kerangka ini diinstal.

masukkan deskripsi gambar di sini

Kunci registri mana yang perlu diubah tergantung pada versi Kerangka yang Anda cari:

Kunci Registri Versi Kerangka Kerja
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ .NETFramework \ Policy \ v1.0 \ 3705 
1.1 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v1.1.4322 \ Instal 
2.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Instal 
3.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.0 \ Setup \ InstallSuccess 
3.5 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.5 \ Instal 
4.0 Profil Klien HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install
4.0 Profil Lengkap HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install

Secara umum Anda mencari:

"Install"=dword:00000001

kecuali untuk .NET 1.0, di mana nilainya adalah string ( REG_SZ) daripada angka ( REG_DWORD).

Menentukan tingkat paket layanan mengikuti pola yang sama:

Kunci Registri Versi Kerangka Kerja
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Active Setup \ Komponen Terpasang \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Versi 
1.0 [1] HKLM \ Software \ Microsoft \ Active Setup \ Komponen Terpasang \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Versi 
1.1 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v1.1.4322 \ SP 
2.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ SP 
3.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.0 \ SP 
3.5 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.5 \ SP 
4.0 Profil Klien HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Servis
4.0 Profil Lengkap HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Servis

[1] Windows Media Center atau Windows XP Tablet Edition

Seperti yang Anda lihat, menentukan level SP untuk perubahan .NET 1.0 jika Anda menjalankan Windows Media Center atau Windows XP Tablet Edition. Sekali lagi, .NET 1.0 menggunakan nilai string sementara yang lain menggunakan DWORD.

Untuk .NET 1.0 nilai string di salah satu kunci ini memiliki format #, #, ####, #. # Terakhir adalah tingkat Paket Layanan.

Meskipun saya tidak secara eksplisit meminta ini, jika Anda ingin tahu nomor versi Kerangka yang tepat Anda akan menggunakan kunci registri ini:

Kunci Registri Versi Kerangka Kerja
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Active Setup \ Komponen Terpasang \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Versi 
1.0 [1] HKLM \ Software \ Microsoft \ Active Setup \ Komponen Terpasang \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Versi 
1.1 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v1.1.4322 
2.0 [2] HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Versi 
2.0 [3] HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Kenaikan
3.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.0 \ Versi 
3.5 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.5 \ Versi 
4.0 Profil Klien HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Versi 
4.0 Profil Lengkap HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Versi 

[1] Windows Media Center atau Windows XP Tablet Edition
[2] .NET 2.0 SP1
[3]. Rilis Asli NET 2.0 (RTM)

Sekali lagi, .NET 1.0 menggunakan nilai string sementara yang lain menggunakan DWORD.

catatan tambahan

  • untuk .NET 1.0 nilai string di salah satu kunci ini memiliki format #,#,####,#. The #,#,####porsi string adalah versi Kerangka.

  • untuk .NET 1.1, kami menggunakan nama kunci registri itu sendiri, yang mewakili nomor versi.

  • Akhirnya, jika Anda melihat dependensi, .NET 3.0 menambahkan fungsionalitas tambahan untuk .NET 2.0 sehingga .NET 2.0 dan .NET 3.0 harus keduanya evaulate sebagai yang diinstal untuk mengatakan bahwa .NET 3.0 diinstal. Demikian pula, .NET 3.5 menambahkan fungsionalitas tambahan untuk .NET 2.0 dan .NET 3.0, jadi .NET 2.0, .NET 3.0, dan .NET 3. harus semuanya mengevaluasi untuk diinstal agar mengatakan bahwa .NET 3.5 diinstal.

  • .NET 4.0 menginstal versi baru CLR (CLR versi 4.0) yang dapat berjalan berdampingan dengan CLR 2.0.

Pembaruan untuk .NET 4.5

Tidak akan ada v4.5kunci dalam registri jika .NET 4.5 diinstal. Alih-alih, Anda harus memeriksa apakah HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Fullkunci berisi nilai yang disebut Release. Jika nilai ini hadir, .NET 4.5 diinstal, jika tidak. Rincian lebih lanjut dapat ditemukan di sini dan di sini .

Scott Dorman
sumber
1
Tampaknya ini tidak berfungsi untuk .NET 1.1 di bawah Vista x64. Tidak ada kunci v1.1.x di salah satu tempat yang memungkinkan. Ide ide?
Chris Hynes
7
Kunci untuk .NET 4.0 tidak cukup benar. Saya melihat kunci-kunci ini: HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install Folder v4.0 hanya memiliki satu kunci , (Default) dengan nilai usang.
RandomEngy
2
Posting ini tidak mencakup 4.5, dan 4.5 tidak terdaftar dalam registri meskipun sudah diinstal.
Klas Mellbourn
37
***, apakah tidak ada seorang pun di Microsoft yang berpikir untuk menambahkan saklar-versi?
gnuchu
2
Itu lelucon. Aku tidak percaya ini bodoh sekali!
Alex Byrth
17

Ada jawaban resmi Microsoft untuk pertanyaan ini di artikel pangkalan pengetahuan berikut:

ID Artikel: 318785 - Tinjauan Terakhir: 7 November 2008 - Revisi: 20.1 Cara menentukan versi .NET Framework yang diinstal dan apakah paket layanan telah diterapkan

Sayangnya, tampaknya tidak berfungsi, karena versi mscorlib.dll dalam direktori 2.0 memiliki versi 2.0, dan tidak ada versi mscorlib.dll di direktori 3.0 atau 3.5 walaupun 3.5 SP1 diinstal ... mengapa apakah jawaban resmi Microsoft akan salah informasi?

segera
sumber
2
+1 - Tampaknya Microsoft mungkin telah memperbarui halaman itu sejak Anda ditautkan awalnya. Jadi sepertinya itu mungkin salah satu sumber resmi terbaik tentang masalah ini.
jpierson
2
Hanya naik hingga 4.0
user316117
16

Kerangka 4 beta menginstal ke kunci registri yang berbeda.

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);
            }
        }
    }
}
midspace
sumber
1
Ubah Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)ke Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")untuk menghindari pengecualian keamanan pada pengguna non-admin.
Jon Cage
Keren, saya menggunakan LinqPad dan memberi saya hasil sempurna! share.linqpad.net/5cjihh.linq
user917170
Sungguh aneh bahwa Anda berbagi tentang detail kecil (seperti versi paket layanan yang diinstal) tetapi informasi yang lebih penting (jika kerangka kerja diinstal hanya sebagian atau seluruhnya) diabaikan oleh kode Anda !! Adalah salah untuk memperlakukan Kunci Registry "Klien" dan "Penuh" seolah-olah mereka sama. Jika hanya kunci "Klien" yang keluar misalnya System.Web tidak akan tersedia. Informasi penting ini juga harus dikembalikan oleh kode Anda! Jika pengguna telah menghapus ".NET Framework 4 Extended" di Control Panel akan ada beberapa majelis yang hilang.
Elmue
8

Saya ingin mendeteksi keberadaan .NET versi 4.5.2 yang diinstal pada sistem saya, dan saya tidak menemukan solusi yang lebih baik daripada ASoft .NET Version Detector .

Cuplikan dari alat ini menampilkan versi .NET yang berbeda:

Cuplikan dari alat ini menampilkan versi .NET yang berbeda

Faisal Mq
sumber
7

Hitung subkunci dari HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP. Setiap subkunci adalah versi .NET . Itu harus memiliki Install=1nilai jika ada di mesin, nilai SP yang menunjukkan paket layanan dan MSI=1nilai jika diinstal menggunakan MSI. (.NET 2.0 pada Windows Vista tidak memiliki yang terakhir misalnya, karena merupakan bagian dari OS.)

Franci Penov
sumber
Saya tidak menemukan kunci ini di mesin saya (XP Pro), tetapi saya memang memilikinya: HKLM \ SOFTWARE \ Microsoft \ .NETFramework. Namun, berbagai nilai yang Anda gambarkan tidak ada untuk saya.
Charlie
Anda harus memiliki kunci ini jika Anda menginstal. NET 1.1 atau yang lebih baru. Kunci yang Anda sebutkan hanya digunakan untuk .NET 1.0.
Scott Dorman
reg permintaan "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP"
antusias1ast
5

Untuk OS 64-bit, jalurnya adalah:

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
abhishek mehta
sumber
10
Ini hanya "agak" benar. Registri dalam versi 64-bit Windows dibagi menjadi kunci 32-bit dan 64-bit (dengan banyak kunci 32-bit memiliki nama yang sama dengan tombol 64-bit). The Wow6432Nodekunci registri merupakan bagian dari reflektor registry WOW64, yang cermin kunci tertentu dan nilai-nilai di antara tampilan registry 64-bit dan 32-bit. Seharusnya tidak perlu mengakses kunci ini secara langsung karena registri secara otomatis menangani pengalihan dan mirroring.
Scott Dorman
5

Pembaruan untuk .NET 4.5.1

Sekarang .NET 4.5.1 tersedia, nilai aktual dari kunci yang bernama Release dalam registri perlu diperiksa, bukan hanya keberadaannya. Nilai 378758 berarti bahwa .NET Framework 4.5.1 diinstal. Namun, seperti dijelaskan di sini nilai ini adalah 378675 pada Windows 8.1.

JasonMcF
sumber
5

Ada alat GUI yang tersedia, ASoft .NET Version Detector , yang selalu terbukti sangat andal. Itu dapat membuat file XML dengan menentukan nama file output XML pada baris perintah.

Anda dapat menggunakan ini untuk otomasi. Ini adalah program kecil, ditulis dalam bahasa yang tidak bergantung pada NET dan tidak memerlukan instalasi.

CarlR
sumber
4

Saya perlu mencari tahu versi .NET framework yang saya miliki di komputer saya, dan yang saya lakukan hanyalah pergi ke panel kontrol dan memilih opsi "Copot Program". Setelah itu, saya mengurutkan program berdasarkan nama, dan menemukan Profil Klien Microsoft .NET Framework 4.

Kudzai K
sumber
1
Terima kasih - Setiap "solusi" lainnya yang saya coba cacat dan tidak akan berhasil. Ini benar.
user20493
Alasan saya datang mencari informasi ini adalah bahwa hal-hal di bawah Uninstall a Program benar-benar tidak dapat diandalkan, setidaknya dalam hal .NET Framework.
tobbenb3
3

Berikut ini adalah skrip PowerShell untuk mendapatkan versi .NET framework yang diinstal

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

Itu ditulis berdasarkan Bagaimana: Menentukan Versi .NET Framework Yang Dipasang . Silakan gunakan fungsi THE Get-FrameworkVersion () untuk mendapatkan informasi tentang versi .NET framework yang diinstal.

cezarypiatek
sumber
2

Menggunakan perpustakaan Signum.Utilities dari SignumFramework (yang dapat Anda gunakan sendiri), Anda bisa mendapatkannya dengan baik dan tanpa berurusan dengan registri sendiri:

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1
sakit kepala
sumber
2
Melihat kode untuk metode ini, tidak terlalu lengkap sejauh apa kunci registri yang digunakannya dan akan melewatkan .NET 1.0 sepenuhnya dan tidak membedakan antara .NET 2.0 (RTM) dan .NET 2.0 SP1. Ini juga tidak memperhitungkan ketergantungan antara versi kerangka kerja.
Scott Dorman
2
Bukan solusi yang bagus. Tidak ada alasan yang baik untuk mengunduh seluruh pustaka hanya untuk mendapatkan versi .NET ketika Anda dapat melakukan pekerjaan yang sama sendiri di sekitar 3 baris kode. Sebagai seorang programmer, Anda HARUS dapat "menangani sendiri registri."
TheSmurf
3
@DannySmurf Saya tidak setuju. Ketika .NET 3.0 diperkenalkan, MS seharusnya membungkusnya dengan .NET API (segera setelah kami memiliki lebih dari satu lapisan FX pada CLR yang sama). Saya lebih suka aplikasi saya menggunakan perpustakaan utilitas, maka ketika 4.1, 6.1, 7.100 tiba, saya hanya dapat memperbarui perpustakaan dan entri konfigurasi untuk lapisan mana. NET aplikasi saya membutuhkan. Tentu saja argumen ini tidak menahan air jika tidak ada perpustakaan yang berfungsi.
yzorg
1

Lihat Cara: Menentukan Versi .NET Framework Yang Dipasang (MSDN).

MSDN mengusulkan satu contoh fungsi yang tampaknya melakukan pekerjaan untuk versi 1-4. Menurut artikel tersebut, keluaran metode adalah:

v2.0.50727  2.0.50727.4016  SP2
v3.0  3.0.30729.4037  SP2
v3.5  3.5.30729.01  SP1
v4
  Client  4.0.30319
  Full  4.0.30319

Perhatikan bahwa untuk "versi 4.5 dan yang lebih baru" ada fungsi lain.

Olivier de Rivoyre
sumber
1

Di Windows 7 (seharusnya bisa juga untuk Windows 8, tapi saya belum mengujinya):

Buka prompt perintah

Langkah-langkah untuk pergi ke command prompt:

  1. Klik Mulai Menu
  2. Di Kotak Pencarian, ketikkan "cmd" (tanpa tanda kutip)
  3. Buka cmd.exe

Dalam cmd, ketikkan perintah ini

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

Ini memberikan versi terbaru NET Framework diinstal.

Anda juga dapat mencoba Raymond.cc Utilties untuk hal yang sama.

Mayank Agarwal
sumber
1
Menjalankan garis itu cmdmemberi saya ERROR: Description = Invalid namespace.
MEMark
saya juga mendapatkanERROR: Description = Invalid namespace
Peter
Perintah ini memberi saya kesalahan! (dieksekusi dari terminal windows 7)
Smrita
Terima kasih MEMark, Peter, Smrita karena memberi tahu.
Mayank Agarwal