2009-04-03 29 views
121

Tengo que encargarme de un paquete que instala ensamblajes directamente en el GAC (por ejemplo, en algún lugar profundo en% windows%/assembly).¿Cómo extraer un ensamblaje del GAC?

¿Cómo puedo exorcizar el ensamblado real (el archivo DLL) del GAC en el sistema de archivos normal?

Gracias.

Respuesta

141

Utilicé el consejo de this article para obtener un ensamblaje del GAC.

Consigue una DLL fuera de la GAC ​​

DLL vez desplegados en GAC (normalmente situados en c: \ windows \ montaje) no se puede ver o emplearse como un archivo DLL normal. No se pueden hacer referencia directa al del proyecto VS . Los desarrolladores suelen tener una copia del archivo DLL original y referirse a ella en el proyecto en tiempo de desarrollo (diseño), que usa el ensamblado de GAC durante el tiempo de ejecución del proyecto.

Durante la ejecución (tiempo de ejecución) si no se encuentra el conjunto ser firmado y desplegado en el CLR GAC automáticamente recoge el ensamblado de la GAC ​​ en lugar de la DLL de 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 forma de obtener el archivo DLL de GAC. Siga los pasos siguientes para copiar DLL desde GAC

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

    • shfusion.dll es una DLL de extensión del explorador que proporciona una apariencia distinta de en la carpeta GAC. Al anular el registro este archivo eliminará el visor de caché de ensamblaje y la carpeta GAC ​​será y estará visible como cualquier carpeta normal en el explorador.
  2. abierto “% windir% \ assembly \ GAC_MSIL”.

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

  4. Copia el archivo DLL en algún lugar de su disco duro y se refieren a partir de ahí, en su proyecto

  5. Ejecutar "regsvr32% windir% \ Microsoft.NET \ Framework \ < .NET versión directorio> \ shfusion. dll "a vuelva a registrar el shfusion.el archivo dll y recuperan la vista distinta original de GAC.

+71

Esto funciona, pero es un poco complicado. Si no tiene miedo del símbolo del sistema, puede simplemente hacer un cd en el directorio necesario y copiar el archivo DLL de esa manera. – Cheeso

+3

sólo tiene que instalar TotalCommander, habilite la opción de ver todos los archivos ocultos y se puede agarrar todas las asambleas desea –

+3

@ Andrew, parece que 'shfusion.dll' no admite la DllInstall()' 'punto de entrada invocado por' regsvr32' cuando pasó la opción '/ i'. Omitir esa opción permite volver a registrar el componente con éxito. –

12

La manera fácil que he encontrado es abrir el símbolo del sistema y navegar a través de la carpeta que mencionas hasta que encuentres la DLL que deseas; a continuación, puedes utilizar el comando de copia para obtenerla. Windows Explorer tiene una vista especial "útil" de esta carpeta.

+0

me encontré con una tema interesante esta mañana. Estaba actualizando una DLL en el GAC y usé el método de la línea cmd para hacer una copia de seguridad. Cuando traté de cargar el nuevo archivo DLL (mismo número de versión), he recibido un error que sólo se marchó cuando apago la ventana cmd. ¡Me tomó unos minutos de maldición para descubrir qué estaba pasando mal! – NeilD

22

Sí.

Añadir DisableCacheViewer clave de registro

Crear una nueva clave DWORD en HKLM \ Software \ Microsoft \ fusión \ con el nombre DisableCacheViewer y establecer su valor [DWORD] a 1.

Volver a Explorador de Windows para la carpeta del ensamblado y será la vista normal del sistema de archivos.

+1

Respuesta subcalificada ¡Gracias! – xr280xr

+0

Esta es la verdadera solución. Fácil de deshacer, y no es necesaria una línea de comando. – user2920518

14

creo que la forma más fácil es hacerlo a través de la línea de comandos como David menciona. El único truco es que el .dll no se encuentra simplemente en C: \ Windows \ Assembly. Debe navegar a C: \ Windows \ Assembly \ GAC \ [ASSEMBLY_NAME] \ [VERSION_NUMBER] _ [CLAVE PUBLICA]. A continuación, puede hacer una copia utilizando:

copia [assembly_name] .dll c: \ (o cualquier ubicación que desee)

Espero que ayude.

2

Esta publicación MSDN blog describe tres formas distintas de extraer una DLL del GAC. Un resumen útil de los métodos dados hasta ahora.

1

navegue a C: \ Windows encontrar el [Asamblea] carpeta haga clic derecho y seleccione Agregar a archivar

esperar un poco

vola usted tiene un archivo comprimido que contiene todos los montajes en su GAC

72

abrir el símbolo del sistema y escriba:

cd c:\windows\assembly\GAC_MSIL 

xcopy . C:\GacDump /s /y 

Esto debería dar la volcado de todo el GAC

¡Disfrútalo!

+0

Deepak, la misma respuesta que ya dio AdamB. – MagicAndi

+9

La respuesta de Deepak fue más clara y usó xcopy con los indicadores apropiados. – katbyte

+0

Calificaría esta respuesta n. ° 1, ya que tardó 5 segundos en obtener todo, después de abordar los problemas en los enfoques paso a paso. – FBryant87

0

Otra dirección: simplemente descomprime el archivo MSI y obtén los objetos de esa manera. Le ahorra la eventual desinstalación. . .

2

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

  1. Active la opción "Mostrar archivos ocultos/Sistema" en Total Commander
  2. Examinar para "c: \ windows \ assembly"
  3. copia
2

Desde un script de PowerShell, puede intentar esta. Solo tenía una versión única del conjunto en el GAC, así 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 el camino de montaje puede utilizar comodines.

4

yo soy el autor de PowerShell GAC. Con PowerShell GAC, puede extraer ensamblajes del GAC sin depender de las partes internas del GAC, como cambiar las estructuras de las carpetas.

Get-GacAssembly SomeCompany* | Get-GacAssemblyFile | Copy-Item -Dest C:\Temp\SomeCompany 
0

No es necesario copiar desde una línea de comando. Escribí el nombre de la DLL desde la búsqueda de la ventana de inicio. Elegí Ver más resultados. El que está en el GAC fue devuelto 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.

2

Think me di cuenta de una manera de mirar dentro de la GAC ​​sin modificar el registro o el uso de la línea de comandos, PowerShell, o cualquier otro programa:

Crear un nuevo acceso directo (a cualquier lugar). A continuación, modifique el acceso directo para tener el objetivo sea:

%windir%\assembly\GAC_MSIL\System 

abrir este acceso directo que lleva a la carpeta del sistema dentro de la GAC ​​(que todo el mundo debería tener) y tiene el efecto secundario maravilloso de lo que le permite cambiar a un directorio superior y a continuación, buscando en cualquier otra carpeta que desee (y ver los archivos DLL, etc)

he probado esto en windows 7 y windows Server 2012.

Nota: no va a dejar que se utiliza ese objetivo al crear el acceso directo pero te permitirá editarlo.

¡Disfrútalo!

6

abierto RUN continuación, escriba %windir%\assembly\GAC_MSIL, esto abrirá sus dlls en vista carpetas, podrá navegar a la carpeta DLL llamada y abrirlo, se encuentra el archivo DLL y copiar fácilmente

+0

Solución muy fácil. Gracias. – Dblock247

Cuestiones relacionadas