¿Cómo extraer un ensamblaje del GAC?

134

Hay un paquete con el que tengo que lidiar que instala los ensamblajes directamente en el GAC (por ejemplo, en algún lugar profundo en% windows% / ensamblaje).

¿Cómo exorcizo el ensamblaje real (la DLL) del GAC en el sistema de archivos normal?

Gracias.

AngryHacker
fuente

Respuestas:

150

Utilicé los consejos de este artículo para obtener un ensamblaje del GAC.

Obtenga DLL de The GAC

Las DLL una vez implementadas en GAC (normalmente ubicadas en c: \ windows \ assembly) no se pueden ver ni usar como un archivo DLL normal. No se pueden referenciar directamente desde el proyecto VS. Los desarrolladores suelen guardar una copia del archivo DLL original y consultarlo en el proyecto en el momento del desarrollo (diseño), que utiliza el ensamblado de GAC durante el tiempo de ejecución del proyecto.

Durante la ejecución (tiempo de ejecución) si se encuentra que el ensamblado está firmado y desplegado en GAC, el CLR recoge automáticamente el ensamblado del GAC en lugar de la DLL a la que se hace referencia durante el tiempo de diseño en VS. En caso de que el desarrollador haya eliminado la DLL original o no la tenga por alguna razón, hay una manera de obtener el archivo DLL de GAC. Siga los siguientes pasos para copiar DLL desde GAC

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

    • shfusion.dll es una extensión DLL del explorador que le da un aspecto distintivo a la carpeta GAC. Si anula el registro de este archivo, se eliminará el visor de caché de ensamblaje y la carpeta GAC ​​será visible como cualquier carpeta normal en el explorador.
  2. Abra "% windir% \ assembly \ GAC_MSIL".

  3. Busque su carpeta DLL en el fondo para encontrar su DLL.

  4. Copie la DLL en algún lugar de su disco duro y consúltela desde allí en su proyecto

  5. Ejecute "regsvr32% windir% \ Microsoft.NET \ Framework \ <.NET version directory> \ shfusion.dll" para volver a registrar el archivo shfusion.dll y recuperar la vista original del GAC.

Andrew Hare
fuente
81
Esto funciona pero es un poco complicado. Si no le teme al símbolo del sistema, simplemente puede crear un CD en el directorio necesario y copiar la DLL de esa manera.
Cheeso
3
Simplemente instale TotalCommander, habilite la opción para ver todos los archivos ocultos y puede tomar todos los ensamblajes que desee
Patrick Peters
44
@ Andrew, parece shfusion.dllque no admite el DllInstall()punto de entrada invocado regsvr32cuando se pasa la /iopción. Omitir esa opción permite volver a registrar el componente con éxito.
Frédéric Hamidi
9
Puede omitir los pasos 1 y 2 e ir directamente a% windir% \ assembly \ GAC_MSIL y navegar desde allí.
Christian Fredh
55
@ChristianFredh Solo una nota: para mí, esto solo se puede hacer directamente desde el cuadro de diálogo Ejecutar.
xr280xr
84

Abra el símbolo del sistema y escriba:

cd  c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y

Esto debería dar el volcado de todo el GAC

¡Disfrutar!

Deepak
fuente
10
La respuesta de Deepak fue más clara y usó xcopy con las banderas apropiadas.
katbyte
Calificaría esta respuesta # 1, ya que tardó 5 segundos en obtener todo, después de abordar los problemas en los enfoques paso a paso.
FBryant87
24

Si.

Agregar clave de registro DisableCacheViewer

Cree una nueva clave dword en HKLM \ Software \ Microsoft \ Fusion \ con el nombre DisableCacheViewer y establezca su valor [DWORD] en 1.

Vuelva al Explorador de Windows a la carpeta de ensamblaje y será la vista normal del sistema de archivos.

Mccrager
fuente
2
Respuesta subestimada. ¡Gracias!
xr280xr
1
Esta es la verdadera solución. Fácil de deshacer, y no se necesita línea de comando.
user2920518
16

Creo que la forma más fácil es hacerlo a través de la línea de comando como lo menciona David. El único truco es que .dll no se encuentra simplemente en C: \ Windows \ Assembly. Tienes que navegar a C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [PUBLIC KEY]. Luego puede hacer una copia usando:

copie [ASSEMBLY_NAME] .dll c: \ (o la ubicación que desee)

Espero que ayude.

AdamB
fuente
13

La manera fácil que he encontrado es abrir el símbolo del sistema y examinar la carpeta que mencionas hasta que encuentres la DLL que deseas; luego puedes usar el comando copiar para sacarla. El Explorador de Windows tiene una vista especial "útil" de esta carpeta.

David M
fuente
Encontré un problema interesante esta mañana. Estaba actualizando una DLL en el GAC y utilicé el método de línea cmd para hacer una copia de seguridad. Cuando intenté cargar la nueva DLL (mismo número de versión), recibí un error que solo desapareció cuando apagué la ventana de cmd. ¡Me tomó unos minutos maldecir para descubrir qué estaba mal!
NeilD
11

Abra EJECUTAR y luego escriba %windir%\assembly\GAC_MSIL, esto abrirá sus archivos DLL en la vista de carpetas, luego puede navegar a su carpeta llamada dll y abrirla, encontrará su archivo dll y lo copiará fácilmente

Hazem Abdelwahab
fuente
Solución muy fácil. Gracias.
Dblock247
4

Soy el autor de PowerShell GAC . Con PowerShell GAC puede extraer ensamblajes del GAC sin depender de elementos internos del GAC, como cambiar las estructuras de carpetas.

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

Utilice el explorador de archivos "Total Commander" en su lugar.

  1. Habilite la configuración "mostrar archivos ocultos / del sistema" en Total Commander
  2. Vaya a "c: \ windows \ assembly"
  3. Copiar
Max
fuente
3

Creo que descubrí una manera de mirar dentro del GAC sin modificar el registro o usar la línea de comandos, powershell o cualquier otro programa:

Cree un nuevo acceso directo (a cualquier lugar). Luego modifique el acceso directo para que el objetivo sea:

%windir%\assembly\GAC_MSIL\System

Abrir este acceso directo lo lleva a la carpeta del Sistema dentro del GAC (que todos deberían tener) y tiene el maravilloso efecto secundario de permitirle cambiar a un directorio más alto y luego buscar cualquier otra carpeta que desee (y ver los archivos dll, etc.)

Probé esto en Windows 7 y Windows Server 2012.

Nota: No le permitirá usar ese objetivo al crear el acceso directo, pero le permitirá editarlo.

¡Disfrutar!

Bolo
fuente
2

simplemente navegue a C: \ Windows encuentre la carpeta [ensamblaje], haga clic derecho y seleccione agregar al archivo

espera un poco

vola tiene un archivo que contiene todos los ensamblajes en su GAC

tsadigov
fuente
2

Desde un script de Powershell, puedes probar esto. Solo tenía una versión única del ensamblaje en el GAC, por lo que funcionó bien.

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

donde la ruta de ensamblaje puede usar comodines.

Phil Kermeen
fuente
0

Otra dirección: simplemente descomprima el archivo MSI y obtenga las golosinas de esa manera. Te salva de la eventual desinstalación. . .

Wyatt Barnett
fuente
0

Copiar desde una línea de comando es innecesario. Escribí el nombre de la DLL en la búsqueda de la ventana de inicio. Elegí Ver más resultados. El del GAC se devolvió en la ventana de búsqueda. Hice clic derecho sobre él y dije abrir la ubicación del archivo. Se abrió en el Explorador de Windows normal. Copié el archivo. Cerré la ventana Hecho.

Scott Shaw-Smith
fuente