Como extrair um assembly do GAC?

134

Há um pacote com o qual tenho que lidar que instala os assemblies diretamente no GAC (por exemplo, em algum lugar profundo em% windows% / assembly).

Como exorcizo o assembly real (a DLL) do GAC no sistema de arquivos normal?

Obrigado.

AngryHacker
fonte

Respostas:

150

Eu usei os conselhos deste artigo para obter uma assembléia no GAC.

Obtenha a DLL do GAC

As DLLs implantadas no GAC (normalmente localizadas em c: \ windows \ assembly) não podem ser exibidas ou usadas como um arquivo DLL normal. Eles não podem ser referenciados diretamente do projeto VS. Os desenvolvedores geralmente mantêm uma cópia do arquivo DLL original e se referem a ele no projeto no momento do desenvolvimento (design), que usa o assembly do GAC durante o tempo de execução do projeto.

Durante a execução (tempo de execução), se o assembly for assinado e implantado no GAC, o CLR selecionará automaticamente o assembly do GAC em vez da DLL mencionada durante o tempo de design no VS. Caso o desenvolvedor tenha excluído a DLL original ou não a tenha por algum motivo, existe uma maneira de obter o arquivo DLL do GAC. Siga as etapas a seguir para copiar a DLL do GAC

  1. Execute regsvr32 / u C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ shfusion.dll

    • shfusion.dll é uma DLL de extensão do explorer que oferece uma aparência distinta à pasta GAC. O cancelamento do registro deste arquivo removerá o visualizador de cache de assembly e a pasta GAC ​​ficará visível como qualquer pasta normal no explorer.
  2. Abra "% windir% \ assembly \ GAC_MSIL".

  3. Navegue até a pasta DLL para encontrar sua DLL.

  4. Copie a DLL em algum lugar do seu disco rígido e consulte-a no seu projeto

  5. Execute "regsvr32% windir% \ Microsoft.NET \ Framework \ <diretório da versão .NET> \ shfusion.dll" para registrar novamente o arquivo shfusion.dll e recuperar a visão distinta original do GAC.

Andrew Hare
fonte
81
Isso funciona, mas é um pouco complicado. Se você não tem medo do prompt de comando, basta inserir o CD no diretório necessário e copiar a DLL dessa maneira.
Cheeso 27/05
3
Basta instalar o TotalCommander, habilitar a opção para ver todos os arquivos ocultos e você pode pegar todos os assemblies desejados
Patrick Peters
4
@ Andrew, parece shfusion.dllque não suporta o DllInstall()ponto de entrada chamado regsvr32quando passou a /iopção. Omitir essa opção permite registrar novamente o componente com sucesso.
Frédéric Hamidi 31/07/2013
9
Você pode pular as etapas 1 e 2 e ir diretamente para% windir% \ assembly \ GAC_MSIL e navegar a partir daí.
Christian Fredh
5
@ChristianFredh Apenas uma observação: para mim, isso só pode ser feito diretamente na caixa de diálogo Executar.
Xr280xr
84

Abra o prompt de comando e digite:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Isso deve fornecer o despejo de todo o GAC

Aproveitar!

Deepak
fonte
10
A resposta de Deepak foi mais clara e usou o xcopy com os sinalizadores apropriados.
katbyte
Eu classificaria esta resposta como 1, pois foram necessários 5 segundos para obter tudo, depois de encontrar problemas nas abordagens passo a passo.
FBryant87
24

Sim.

Adicionar chave de registro DisableCacheViewer

Crie uma nova chave dword em HKLM \ Software \ Microsoft \ Fusion \ com o nome DisableCacheViewer e defina seu valor [DWORD] como 1.

Volte ao Windows Explorer para a pasta assembly e será a visualização normal do sistema de arquivos.

Mccrager
fonte
2
Resposta sub-classificada. Obrigado!
xr280xr
1
Esta é a solução real. Fácil de desfazer e sem necessidade de linha de comando.
user2920518
16

Eu acho que a maneira mais fácil é fazê-lo através da linha de comando, como David menciona. O único truque é que a DLL não está simplesmente localizada em C: \ Windows \ Assembly. Você precisa navegar para C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY]. Você pode fazer uma cópia usando:

copie [ASSEMBLY_NAME] .dll c: \ (ou qualquer local que você quiser)

Espero que ajude.

AdamB
fonte
13

A maneira mais fácil que encontrei é abrir o prompt de comando e navegar pela pasta mencionada até encontrar a DLL desejada - você pode usar o comando de cópia para removê-lo. O Windows Explorer tem uma exibição especial "útil" desta pasta.

David M
fonte
Encontrei uma questão interessante esta manhã. Eu estava atualizando uma DLL no GAC e usei o método de linha cmd para fazer um backup. Quando tentei carregar a nova DLL (mesmo número de versão), recebi um erro que só desapareceu quando eu fechei a janela do cmd. Levei alguns minutos amaldiçoando para descobrir o que estava dando errado!
NeilD
11

Abra EXECUTAR e digite %windir%\assembly\GAC_MSIL: isso abrirá suas DLLs no modo de exibição de pastas. Você pode navegar até sua pasta nomeada DLL e abri-la. Você encontrará seu arquivo DLL e copiará-o facilmente.

Hazem Abdelwahab
fonte
Solução muito fácil. Obrigado.
Dblock247
4

Eu sou o autor do PowerShell GAC . Com o PowerShell GAC, você pode extrair montagens do GAC sem depender dos componentes internos do GAC, como alterar as estruturas de pastas.

Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany
Lars Truijens
fonte
3

Esta postagem do blog do MSDN descreve três maneiras distintas de extrair uma DLL do GAC. Um resumo útil dos métodos até agora apresentados.

MagicAndi
fonte
3

Use o navegador de arquivos "Total Commander".

  1. Habilite a configuração "show hidden / system files" no Total Commander
  2. Navegue para "c: \ windows \ assembly"
  3. cópia de
Máx.
fonte
3

Acho que descobri uma maneira de analisar o interior do GAC sem modificar o registro ou usar a linha de comando, o PowerShell ou qualquer outro programa:

Crie um novo atalho (para qualquer lugar). Em seguida, modifique o atalho para que o destino seja:

%windir%\assembly\GAC_MSIL\System

A abertura desse atalho leva você para a pasta Sistema dentro do GAC (que todos deveriam ter) e tem o maravilhoso efeito colateral de permitir que você alterne para um diretório mais alto e depois navegue para qualquer outra pasta desejada (veja os arquivos DLL, etc.)

Eu testei isso no Windows 7 e Windows Server 2012.

Nota: Ele não permitirá que você use esse destino ao criar o atalho, mas permitirá que você o edite.

Aproveitar!

Bolo
fonte
2

basta navegar para C: \ Windows, encontrar a pasta [assembly], clicar com o botão direito e selecionar adicionar ao arquivo

espere um pouco

vola, você tem um arquivo que contém todos os assemblies no seu GAC

tsadigov
fonte
2

Em um script do Powershell, você pode tentar isso. Eu só tinha uma única versão do assembly no GAC, então isso funcionou perfeitamente.

cd "c:\Windows\Microsoft.NET\assembly\GAC_MSIL\"
Get-ChildItem assemblypath -Recurse -Include *.dll |  Copy-Item -Destination "c:\folder to copy to"

onde o caminho do assembly pode usar caracteres curinga.

Phil Kermeen
fonte
0

Uma outra direção - basta descompactar o arquivo MSI e obter os benefícios dessa maneira. Salva você da eventual desinstalação. . .

Wyatt Barnett
fonte
0

Copiar de uma linha de comando é desnecessário. Eu digitei o nome da DLL na pesquisa da Janela Iniciar. Eu escolhi Ver mais resultados. O do GAC foi retornado na janela de pesquisa. Cliquei com o botão direito do mouse e disse o local do arquivo aberto. Ele foi aberto no Windows Explorer normal. Eu copiei o arquivo. Fechei a janela. Feito.

Scott Shaw-Smith
fonte