2009-06-11 18 views
63

Tenemos una aplicación web que se implementa en muchos sitios web con solo cambios frontend, la parte compartida del backend tiene su DLL en el GAC, por lo que solo debemos actualizar esa dll y todos los sitios obtienen la actualización.Dll en el bin y el gac, ¿cuál se usa?

¿Hay alguna manera de anular el GAC con una DLL en la carpeta/bin para probar nuevas características antes de que se publiquen?

Respuesta

78

Si tiene el mismo número de versión que la DLL a la que se hace referencia, se utiliza el GAC.

Si incrementa el número de versión, reconstruye el sitio web haciendo referencia al nuevo número de versión, coloca la nueva versión en el directorio/bin y luego se usará esa DLL.

Si no quiere cambiar el número de versión, no tiene suerte.

Cuando .NET carga ensamblajes con nombres fuertes, primero intenta decidir qué número de versión usar. Lo hace a través de la referencia primero, luego busca publisher policies, luego busca binding redirects en el archivo de configuración.

Después de hacer esto, busca el ensamblaje en el GAC, luego en cualquier codebase specified, luego explora varias carpetas del sistema de archivos para la DLL. Si en alguno de esos pasos encuentra el ensamblaje de versión correcto, se detiene.

Si no está cambiando el número de versión de su ensamblaje con nombre seguro, .NET encontrará el original en el GAC y dejará de buscar. Tenga en cuenta que, dado que se detiene cuando se encuentra uno, y como es primero buscar en el GAC, especificar una base de código para su ensamblaje no servirá de nada a menos que también especifique un nuevo número de versión.

+1

¿Entiendo esto correcto? Si la versión 1.0.0.0 está en el GAC pero compilo con la versión 1.0.0.1 y coloco 1.0.0.1 en mi BIN, entonces GAC se ignora y se utiliza BIN.Si elimino el archivo .dll de mi BIN, entonces se utilizará 1.0.0.0 en el GAC, aunque compilé con 1.0.0.1. –

+1

No. Si compila contra un ensamblado de nombre seguro, necesitará el número de versión exacto, a menos que exista una política de editor o redireccionamientos de enlace disponibles. –

+1

Las políticas de editor y los redireccionamientos de enlace permiten la redirección de la versión #, de modo que si su programa está compilado contra 1.0.0.0 y hay una directiva de editor o redireccionamiento de enlace que especifica 1.0.0.1, entonces esa se convierte en la versión que busca. –

2

Creo que podría estar diciendo lo mismo que Adam Sills, pero reformulado para mi comprensión. A través de mi propia prueba, parece que esto es lo que sucede:

  • Si la aplicación se compila con la versión 1.0.0.0 y 1.0.0.1 se encuentra en la GAC, entonces se puede omitir el .dll de su/bin.
  • Si su aplicación está compilada con la versión 1.0.0.1 y 1.0.0.0 está en el GAC, entonces DEBE colocar el .dll en su/bin para ignorar el GAC. Se producirá un error si la versión de GAC es anterior a la versión requerida de su aplicación, a menos que incluya la versión más nueva en su/bin.

espero que esto es correcto ...

+1

.NET Framework * * no hará la redirección de versión de ensamblados nombrados fuertes automáticamente, al menos a partir de .NET 3.5 (tiempo de ejecución .NET 2.0) Teóricamente .NET 4 podría cambiar las reglas, pero lo dudo. –

+1

Gracias! Ahora veo por qué mis pruebas funcionaron con diferentes versiones. Pensé que el nombre fuerte era solo la clave con la que lo registraste. Pero en realidad tengo dos ensamblajes registrados en GAC 1.0.0.0 y 1.0.0.1 ambos con el mismo token de clave pública. Pensé que si usaba la misma clave, 1.0.0.1 reemplazaría 1.0.0.0. Pero ese no parece ser el caso.
Gracias @ Adam por su ayuda! –

0

Puede ver información de enlace en el archivo de registro utilizando el enlace de ensamblado Visor de registro (Fuslogvw.exe), que se incluye en el kit de desarrollo de software de Windows (SDK)

s

11

he sido capaz de anular el GAC con el conjunto de la carpeta \ bin utilizando el elemento <codebase>.

Al especificar <codebase version="1.2.3.4" href="/bin/MyAssembly.dll" /> en mi archivo web.config puedo decirle a mi aplicación que use esta versión en lugar de la versión especificada en el GAC.

¿Desea conocer el elemento <probing> para especificar ubicaciones de montaje?

+5

, debe verificar que los dll estén firmados o no. GAC tiene prioridad sobre la base de código y la sonda. Una vez que encuentra la versión firmada en GAC, se detiene. Probé esto con 4.0 y el documento de MSDN es preciso, primero BindingRedirect, luego GAC, luego CodeBase, luego Probe for StrongName assemblies – CodeCowboyOrg

Cuestiones relacionadas