newtonsoft - Obligar a la aplicación ASP.NET a cargar el ensamblaje desde bin no desde GAC
razor partial (8)
¿Hay alguna manera de forzar a mi aplicación asp.net a cargar el ensamblado desde el directorio bin local ya que hay otra versión anterior del ensamblado con el mismo nombre en el gac?
No puedo eliminar la versión de gac ya que otras aplicaciones la están usando y tengo dificultades al agregar la versión más nueva al gac.
¡La configuración oldVersion sugerida por Muse VSExtensions funciona! Puede usar el nombre seguro para el ensamblado local: mire esta página: http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx
Básicamente en web.config agrega algo como:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="DllName"
publicKeyToken="0123456789abc"
culture="neutral" />
<!-- Assembly versions can be redirected in app,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="2.0.0.0-2.5.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
De esta forma, si tengo un ensamblado en el gac que pueda ser de la versión 2.0.0.0 a la versión 2.5.0.0, todas las llamadas se redireccionarán a newVersion (3.0.0.0)
En la sección de ensambles, agregué el conjunto:
<add assembly="DllName, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0123456789abc" />
Y eso es.
¿Por qué no instalar la versión que le gusta en el GAC y luego hacer referencia a ella en el GAC?
Cambie el número de versión, nombre fuerte el ensamblado y haga referencia a la versión superior fuertemente nombrada que implementa con su solución.
Como alternativa a la solución propuesta, durante el desarrollo puede vincularse por completo al ensamblaje que desee sobreescribiendo el GAC configurando la variable de entorno DEVPATH
y habilitando el Modo de desarrollo en machine.config
. Creo que esta es, de lejos, la forma más fácil de lograr lo que desea, pero no debe utilizarse en producción.
Esto resuelve el problema donde la versión de su ensamblado y la del GAC son las mismas, si las versiones son diferentes, debe usar el enfoque bindingRedirect
mencionado aquí por varios usuarios.
Primero, agregue lo siguiente a machine.config
:
<configuration>
<runtime>
<developmentMode developerInstallation="true"/>
</runtime>
</configuration>
A continuación, establezca la variable de entorno DEVPATH
en la ubicación de los ensamblajes no firmados. Esto forzará que el modo DEVOVERRIDE de Fusion patee y busque el DEVPATH
(y sus subdirectorios) antes de probar el GAC.
Las preguntas frecuentes de DEVPATH
y DEVOVERRIDE
en MSDN responderán la mayoría de las preguntas sobre los efectos de usar esto.
Fusion (cargador de ensamblados de .NET) buscará solo por nombre y versión, tratará ensamblajes fuertemente nombrados igual a otros ensamblajes, no buscará en el GAC antes de buscar DEVPATH
, y simplemente devolverá la primera coincidencia encontrada. Debe usar Fusion Log Viewer (fuslogvw) para ver si lo habilitó correctamente, como se explica en esta publicación de blog en DEVPATH
.
Nuevo en usar FusLogVw? Scott Hanselman escribió una excelente introducción . La interfaz del Visor es bastante arcaica y lleva un tiempo acostumbrarse.
Tenga en cuenta que Fusion Log Viewer (o Assembly Binding Log Viewer, lo que hay en un nombre) indicará confusamente que utilizó la variable de entorno DEVOVERRIDE
. Debería verse algo como esto:
LOG: Found assembly in DEVOVERRIDE path D:/testassemblies/Test.DLL
NOTA: si desea que Visual Studio cargue los ensamblados desde la ubicación DEVPATH
, debe establecer una clave de registro en esta ubicación , es decir, establecer (verifique la clave de versión de .NET para que coincida con su versión de .NET):
[HKEY_CURRENT_USER/
SOFTWARE/
Microsoft/
.NETFramework/
v2.0.50727/AssemblyFoldersEx/
DEVPATH]@="C:/SharedAssemblies"
En función de las notas extraídas sobre el orden de carga del ensamblaje, en esta respuesta: ¿Cómo evitar que una aplicación .NET cargue / haga referencia a un ensamblaje desde el GAC?
Supongo que llamar a LoadLibrary en el archivo DLL local antes de pedirle a la biblioteca que cargue como un ensamblado, podría moverlo en la orden de búsqueda por usted.
Lamentablemente, no estoy seguro de cómo hacer que su llamada a LoadLibrary se ejecute antes de que el framework comience a cargar los ensambles a los que se hace referencia.
Entonces esto es solo una idea, no una respuesta completa.
En lugar de usar bindingRedirect , puede especificar la ruta de la base de código . Tengo un ejemplo de trabajo con MySQL.Data.dll.
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<codebase version="5.2.5.0" href="/bin/MySQL.Data.dll" />
</dependentAssembly>
Esto se puede hacer en Web.config de la aplicación web.
Lo encontré
Para obligar a su aplicación a leer desde el directorio de bin local, debe eliminar la firma de su ensamblado y luego la aplicación cargará el ensamblaje desde el contenedor.
Gracias Wyatt Barnett y murad.
Para redirigir una versión a otra, use el elemento <bindingRedirect>. El atributo oldVersion puede especificar una versión única o un rango de versiones. Por ejemplo, especifica que el tiempo de ejecución debe usar la versión 2.0.0.0 en lugar de las versiones de ensamblaje entre 1.1.0.0 y 1.2.0.0.
s