Como detecto quais versões e service packs do .NET Framework estão instalados?

289

Uma pergunta semelhante foi feita aqui , mas era específica ao .NET 3.5. Especificamente, estou procurando o seguinte:

  1. Qual é a maneira correta de determinar quais versões e service packs do .NET Framework estão instalados?
  2. Existe uma lista de chaves do Registro que podem ser usadas?
  3. Existe alguma dependência entre as versões do Framework?
Scott Dorman
fonte
2
Esta questão está intimamente relacionada a stackoverflow.com/questions/198931/… e stackoverflow.com/questions/182910/…
Pascal Paradis
Sim, ele é. Eu já sabia sobre o primeiro (é o que me refiro na minha pergunta). Eu não sabia sobre o outro.
22926 Scott Dorman
3
Estou impressionado como essa pergunta (incluindo respostas) e todas as perguntas estreitamente relacionadas ignoram completamente a presença dos valores de SKU - isso até diferencia entre 4.5 e 4.5.1.
springy76
@ springy76, a razão pela qual isso não aborda a presença de valores de SKU é porque, para fins de determinar quais versões do Framework estão instaladas, elas não são relevantes. A pergunta a que você se refere está realmente tentando determinar se o ".NET 4.0.2" está instalado. O problema aqui é que não havia o .NET 4.0.2, era uma atualização (KB2544514), não uma versão do Framework ou um service pack. Você pode consultar este artigo no MSDN ( msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx ) para obter mais informações sobre como detectar quais atualizações estão instaladas.
Scott Dorman
Aqui você tem verificar qual versão do .net ...
DanielV

Respostas:

365

O registro é a maneira oficial de detectar se uma versão específica do Framework está instalada.

insira a descrição da imagem aqui

Quais chaves de registro são necessárias mudam dependendo da versão do Framework que você está procurando:

Chave do Registro da Versão do Framework
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ .NETFramework \ Policy \ v1.0 \ 3705 
1.1 Instalação do HKLM \ Software \ Microsoft \ NET Framework \ NDP \ v1.1.4322 \ Install 
2.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Install 
3.0 HKLM \ Software \ Microsoft \ NET Framework Instalação \ NDP \ v3.0 \ Setup \ InstallSuccess 
3.5 Instalação do HKLM \ Software \ Microsoft \ NET Framework \ NDP \ v3.5 \ Install 
4.0 Configuração do perfil do cliente HKLM \ Software \ Microsoft \ NET \ NDP \ v4 \ Client \ Install
4.0 Perfil completo HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install

Geralmente você está procurando:

"Install"=dword:00000001

exceto o .NET 1.0, onde o valor é uma string ( REG_SZ) em vez de um número ( REG_DWORD).

A determinação do nível do service pack segue um padrão semelhante:

Chave do Registro da Versão do Framework
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Configuração ativa \ Componentes instalados \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Version 
1.0 [1] HKLM \ Software \ Microsoft \ Instalação ativa \ Componentes instalados \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Version 
1.1 Instalação do HKLM \ Software \ Microsoft \ NET Framework \ 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 Instalação do HKLM \ Software \ Microsoft \ NET Framework \ NDP \ v3.5 \ SP 
4.0 Configuração do perfil do cliente HKLM \ Software \ Microsoft \ NET \ NDP \ v4 \ Client \ Servicing
4.0 Perfil completo HKLM \ Software \ Microsoft \ NET Framework Instalação \ NDP \ v4 \ Full \ Servicing

[1] Windows Media Center ou Windows XP Tablet Edition

Como você pode ver, a determinação do nível de SP do .NET 1.0 é alterada se você estiver executando o Windows Media Center ou o Windows XP Tablet Edition. Novamente, o .NET 1.0 usa um valor de seqüência de caracteres, enquanto todos os outros usam um DWORD.

Para o .NET 1.0, o valor da sequência em uma dessas chaves tem o formato de #, #, ####, #. O último # é o nível do Service Pack.

Embora eu não tenha solicitado isso explicitamente, se você quiser saber o número exato da versão do Framework, use estas chaves do Registro:

Chave do Registro da Versão do Framework
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Configuração ativa \ Componentes instalados \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Version 
1.0 [1] HKLM \ Software \ Microsoft \ Instalação ativa \ Componentes instalados \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Version 
1.1 Instalação do HKLM \ Software \ Microsoft \ NET Framework \ NDP \ v1.1.4322 
2.0 [2] HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Version 
2.0 [3] HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Increment
3.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.0 \ Version 
3.5 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.5 \ Version 
4.0 Configuração do perfil do cliente HKLM \ Software \ Microsoft \ NET \ NDP \ v4 \ Version 
4.0 Perfil completo HKLM \ Software \ Microsoft \ NET Framework Instalação \ NDP \ v4 \ Version 

[1] Windows Media Center ou Windows XP Tablet Edition
[2] .NET 2.0 SP1
[3] Versão original do .NET 2.0 (RTM)

Novamente, o .NET 1.0 usa um valor de seqüência de caracteres, enquanto todos os outros usam um DWORD.

Notas Adicionais

  • para .NET 1.0, o valor da sequência em uma dessas chaves tem um formato de #,#,####,#. A #,#,####parte da string é a versão do Framework.

  • para o .NET 1.1, usamos o nome da chave do registro, que representa o número da versão.

  • Por fim, se você observar as dependências, o .NET 3.0 adiciona funcionalidade adicional ao .NET 2.0, para que o .NET 2.0 e o .NET 3.0 precisem ser avaliados como instalados para dizer corretamente que o .NET 3.0 está instalado. Da mesma forma, o .NET 3.5 adiciona funcionalidade adicional ao .NET 2.0 e .NET 3.0, portanto, o .NET 2.0, .NET 3.0 e .NET 3. devem avaliar a instalação para dizer corretamente que o .NET 3.5 está instalado.

  • O .NET 4.0 instala uma nova versão do CLR (CLR versão 4.0) que pode ser executada lado a lado com o CLR 2.0.

Atualização para .NET 4.5

Não haverá uma v4.5chave no registro se o .NET 4.5 estiver instalado. Em vez disso, você deve verificar se a HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Fullchave contém um valor chamado Release. Se esse valor estiver presente, o .NET 4.5 está instalado, caso contrário, não está. Mais detalhes podem ser encontrados aqui e aqui .

Scott Dorman
fonte
1
Isso não parece funcionar para o .NET 1.1 no Vista x64. Nenhuma chave v1.1.x está em qualquer um dos locais possíveis. Ideias?
4911 Chris Hynes
7
As chaves do .NET 4.0 não estão totalmente corretas. Estou vendo estas chaves: HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install A pasta v4.0 possui apenas uma chave , (Padrão) com um valor descontinuado.
usar o seguinte comando
2
Esta postagem não cobre o 4.5 e o 4.5 não está listado no registro, mesmo que esteja instalado.
Klas Mellbourn
37
Cara, ninguém na Microsoft pensou em adicionar uma opção de versão?
gnuchu
2
É uma piada. Não acredito que é muuuito idiota!
precisa saber é o seguinte
17

Há uma resposta oficial da Microsoft para esta pergunta no seguinte artigo da base de conhecimento:

ID do artigo 318785 - Última revisão: 7 de novembro de 2008 - Revisão: 20.1 Como determinar quais versões do .NET Framework estão instaladas e se os service packs foram aplicados

Infelizmente, parece não funcionar, porque a versão mscorlib.dll no diretório 2.0 possui uma versão 2.0 e não há nenhuma versão mscorlib.dll nos diretórios 3.0 ou 3.5, mesmo que o 3.5 SP1 esteja instalado ... por que a resposta oficial da Microsoft seria tão desinformada?

anon
fonte
2
+1 - Parece que a Microsoft pode ter atualizado essa página desde que você vinculou originalmente a ela. Portanto, parece que essa pode ser uma das melhores fontes oficiais sobre o assunto.
Jpierson #
2
Ele só sobe para 4,0 #
user316117
16

O Framework 4 beta é instalado em uma chave do Registro diferente.

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);
            }
        }
    }
}
meio espaço
fonte
1
Altere Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)para Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")para evitar uma exceção de segurança em usuários não administradores.
Jon gaiola
Legal, usei o LinqPad e me deu resultados perfeitos! share.linqpad.net/5cjihh.linq
user917170
É estranho que você compartilhe pequenos detalhes (como a versão do service pack instalada), mas as informações mais importantes (se a estrutura estiver instalada apenas parcial ou completamente) serão ignoradas pelo seu código! É errado tratar as Chaves do Registro "Cliente" e "Completo" como se fossem iguais. Se apenas a chave "Cliente" sair, por exemplo, System.Web não estará disponível. Esta informação importante também deve ser retornada pelo seu código! Se o usuário tiver desinstalado o ".NET Framework 4 Extended" no Painel de Controle, haverá vários assemblies ausentes.
Elmue #
8

Eu queria detectar a presença do .NET versão 4.5.2 instalada no meu sistema e não encontrei uma solução melhor do que o ASoft .NET Version Detector .

Instantâneo desta ferramenta mostrando diferentes versões do .NET:

Instantâneo desta ferramenta mostrando diferentes versões do .NET

Faisal Mq
fonte
7

Enumere as subchaves de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP. Cada subchave é uma versão do .NET . Ele deve ter Install=1valor se estiver presente na máquina, um valor de SP que mostra o service pack e um MSI=1valor se foi instalado usando um MSI. (O .NET 2.0 no Windows Vista não possui o último, por exemplo, pois faz parte do sistema operacional.)

Franci Penov
fonte
Não encontrei essa chave na minha máquina (XP Pro), mas tinha o seguinte: HKLM \ SOFTWARE \ Microsoft \ .NETFramework. No entanto, os vários valores que você descreve não existem para mim.
1313 Charlie
Você deve ter essa chave se tiver o .NET 1.1 ou posterior instalado. A chave que você mencionou foi usada apenas no .NET 1.0.
Scott Dorman
consulta reg "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP"
entusiasus1ast 10/15/15
5

Para um sistema operacional de 64 bits, o caminho seria:

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
abhishek mehta
fonte
10
Isso é apenas "um pouco" verdadeiro. O registro nas versões de 64 bits do Windows é dividido em chaves de 32 e 64 bits (com muitas das chaves de 32 bits com o mesmo nome que as chaves de 64 bits). A Wow6432Nodechave do registro faz parte do refletor do registro WOW64, que reflete determinadas chaves e valores entre as visualizações de registro de 64 e 32 bits. Não deve haver necessidade de acessar essa chave diretamente, pois o registro manipula automaticamente o redirecionamento e o espelhamento.
Scott Dorman
5

Atualização para .NET 4.5.1

Agora que o .NET 4.5.1 está disponível, o valor real da chave denominada Release no registro precisa ser verificado, não apenas sua existência. Um valor de 378758 significa que o .NET Framework 4.5.1 está instalado. No entanto, conforme descrito aqui, esse valor é 378675 no Windows 8.1.

JasonMcF
fonte
5

Existe uma ferramenta GUI disponível, o ASoft .NET Version Detector , que sempre se mostrou altamente confiável. Ele pode criar arquivos XML especificando o nome do arquivo da saída XML na linha de comandos.

Você pode usar isso para automação. É um pequeno programa, escrito em uma linguagem não dependente do .NET e não requer instalação.

CarlR
fonte
4

Eu estava precisando descobrir qual versão do .NET framework eu tinha no meu computador e tudo o que fiz foi ir ao painel de controle e selecionar a opção "Desinstalar um programa". Depois disso, classifiquei os programas por nome e encontrei o Microsoft .NET Framework 4 Client Profile.

Kudzai K
fonte
1
Obrigado - Todas as outras "soluções" que tentei eram falhas e não funcionavam. Isso fez.
User20493
O motivo pelo qual vim procurar essas informações foi que o material em Desinstalar um programa não é totalmente confiável, pelo menos no que diz respeito ao .NET Framework.
precisa
3

Aqui está um script do PowerShell para obter versões instaladas do .NET Framework

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

Foi escrito com base em Como: Determinar quais versões do .NET Framework estão instaladas . Por favor, use a função Get-FrameworkVersion () para obter informações sobre as versões instaladas do .NET Framework.

cezarypiatek
fonte
2

Usando a biblioteca Signum.Utilities do SignumFramework (que você pode usar autônomo), você pode obtê-lo de maneira agradável e sem precisar lidar com o registro:

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1
mapache
fonte
2
Analisando o código desse método, ele não é muito completo quanto às chaves de registro que ele usa e perderá completamente o .NET 1.0 e não fará distinção entre o .NET 2.0 (RTM) e o .NET 2.0 SP1. Também não leva em conta as dependências entre as versões da estrutura.
Scott Dorman
2
Não é uma boa solução. Não há um bom motivo para baixar uma biblioteca inteira apenas para obter a versão .NET quando você pode fazer o mesmo trabalho em cerca de três linhas de código. Como programador, você deve "lidar com o registro por conta própria".
TheSmurf
3
@DannySmurf Não concordo. Quando o .NET 3.0 foi introduzido, o MS deveria incluí-lo em uma API .NET (assim que tivemos mais de uma camada de FX no mesmo CLR). Prefiro que meu aplicativo use uma biblioteca de utilitários; quando 4.1, 6.1, 7.100 chegar, eu posso atualizar a biblioteca e uma entrada de configuração para qual camada do .NET meu aplicativo requer. É claro que esse argumento não retém a água se nenhuma das bibliotecas funcionar.
yzorg 27/07/10
1

Consulte Como determinar quais versões do .NET Framework estão instaladas (MSDN).

O MSDN propõe um exemplo de função que parece fazer o trabalho para a versão 1-4. De acordo com o artigo, a saída do método é:

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

Observe que para "versões 4.5 e posteriores" há outra função.

Olivier de Rivoyre
fonte
1

No Windows 7 (também deve funcionar no Windows 8, mas ainda não o testei):

Vá para um prompt de comando

Etapas para ir para um prompt de comando:

  1. Clique no menu Iniciar
  2. Na caixa de pesquisa, digite "cmd" (sem aspas)
  3. Abra o cmd.exe

No cmd, digite este comando

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

Isso fornece a versão mais recente do NET Framework instalada.

Pode-se também experimentar o Raymond.cc Utilities pelo mesmo.

Mayank Agarwal
fonte
1
Executando essa linha cmdme dá ERROR: Description = Invalid namespace.
MEMark
eu também recebo ERROR: Description = Invalid namespace
Peter Peter
Este comando me dá erro! (executado a partir do terminal windows 7)
Smrita
Obrigado MEMark, Peter, Smrita por notificar.
Mayank Agarwal