asp.net - tag - .Net escogiendo la versión de montaje referenciada incorrectamente
tag helpers asp net core (17)
- Vaya a C: / WINDOWS / Microsoft.NET / Framework / v2.0.50727 / CONFIG
- Encuentra el archivo machine.config
- abrir en el bloc de notas
- encontrar el conflicto dll
- Eliminar esto y guardar.
conjuntos de compilación
addassembly = dllName, Version = 1.0.0000.0000 Culture = neutral, PublicKeyToken = "QWEWQERWETERY"
compilación de ensambles
funciona para mi.
Acabo de copiar un proyecto existente en una máquina completamente nueva para comenzar a desarrollarlo y me he encontrado con un problema con la versión de uno de mis ensamblados a los que se hace referencia (una DLL de telerik como ocurre).
El proyecto originalmente hizo referencia a una versión anterior del ensamblado (vamos a llamarlo v1.0.0.0). Mi nueva máquina tiene instalada la última versión del ensamblaje, así que pensé que la había actualizado (llamemos a la nueva versión v2.0.0.0).
Ahora este es el problema: si copio el archivo dll v1.0.0.0 antiguo en la carpeta del proyecto y lo agrego como referencia, el sitio web se inicia sin problemas. Si elimino esa referencia (y también elimino la antigua DLL de mi sistema) y agrego la nueva versión (v2.0.0.0), la página muestra la siguiente excepción:
No se pudo cargar el archivo o ensamblado ''XXXXXX, Versión = 1.0.0.0, Cultura = neutral, PublicKeyToken = 121fae78165ba3d4'' o una de sus dependencias. La definición del manifiesto del ensamblaje ubicado no coincide con la referencia de ensamblaje. (Excepción de HRESULT: 0x80131040)
Claramente, el código está buscando la versión desactualizada y no puede encontrarla. ¿Pero por qué?
Agudé la carpeta de la solución para ese número de versión y no pude encontrar una sola referencia. Comprobé dos veces el texto del archivo .csproj y encontré que la versión muestra correctamente la última versión y HintPath muestra correctamente la ruta a la nueva DLL. Además, como no instalé el antiguo DLL en el sistema, no aparece en mi GAC (aunque lo hace en v2.0.0.0, como se esperaba).
Luego habilité el visor de registro de fusión para tratar de descubrir por qué está buscando esa versión anterior, pero no tuve suerte:
Assembly Load Trace: The following information can be helpful to determine why the assembly ''XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4'' could not be loaded.
=== Pre-bind state information ===
LOG: User = MyComp/me
LOG: DisplayName = XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
(Fully-specified)
LOG: Appbase = file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/
LOG: Initial PrivatePath = d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin
Calling assembly : WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/web.config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/config/machine.config.
LOG: Post-policy reference: XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX/XXXXXX.DLL.
LOG: Attempting download of new URL file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin/XXXXXX.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
Todo lo dice que comienza buscando esa vieja asamblea. Intenté encontrar una solución en línea y vi esta pregunta similar, pero parece ser exactamente lo contrario de mi problema. El programa del que pregunta fue encontrar el DLL incorrecto en lugar del referido. Mientras que mi problema es que el programa está misteriosamente buscando el DLL incorrecto y no puede encontrarlo cuando el correcto se puede encontrar localmente en la carpeta bin y en el GAC.
¿Por qué el mío está buscando la versión anterior? ¿Dónde más puedo buscar para encontrar esta mala referencia?
¿Tiene algún otro proyecto en esa solución? (Puede ser que otro proyecto esté haciendo referencia a una versión anterior). Normalmente, en VS, la dependencia dll abarca todos los proyectos en la solución.
En caso de que se ahorre a alguien más 3 horas ... mi caso fue un poco diferente. Mi código usa DevExpress v11.1 v11.1.4.0. Hice todo referenciado correctamente en mi código. Pero el perfilador de memoria .net instaló DevExpress v11.1 v11.1.12.0 en el GAC. De hecho, no fueron los componentes a los que hice referencia sino los que hicieron referencia internamente que fallaron. Por más que lo intente, el GAC siempre se verifica primero. Se compiló y funcionó bien, pero no pude ver el diseñador de formularios ganador y el seguimiento de la pila no fue de ninguna ayuda. Finalmente se desinstaló el perfilador de memoria .net y todo se restauró.
Es casi como si tuviera que borrar su computadora para deshacerse de la vieja dll. Ya he intentado todo lo anterior y luego di el paso adicional de simplemente eliminar cada instancia del archivo .DLL que estaba en mi computadora y eliminar todas las referencias de la aplicación. Sin embargo, todavía se compila muy bien y cuando se ejecuta está haciendo referencia a las funciones dll muy bien. Estoy empezando a preguntarme si está haciendo referencia a ella desde un disco de red.
Esta no es una respuesta clara de por qué, pero tuvimos este problema, aquí están nuestras circunstancias y lo que lo resolvió:
Dev 1:
La solución contiene el Proyecto A que hace referencia a un Paquete NuGet, y un proyecto MVC que hace referencia al Proyecto A. Habilitado la Restauración de paquetes NuGet, luego se actualizó el paquete NuGet. Obtuve un error de tiempo de ejecución quejándose de que no se puede encontrar la lib de NuGet, pero el error es buscar la versión anterior, no actualizada. Solución (y esto es ridículo): Establezca un punto de interrupción en la primera línea de código en el proyecto MVC que llama Proyecto A. Ingrese con F11. Resuelto - nunca más tuve un problema.
Dev 2:
Misma solución y proyectos, pero el punto de interrupción mágico y el paso en solución no funcionan. Busqué redireccionamientos de versiones u otras referencias incorrectas a este paquete de Nuget, eliminé el paquete y lo reinstalé, limpié bin, obj, Asp.Net Temp, nada lo resolvió. Finalmente, renombrado Proyecto A, ejecutó el proyecto MVC - arreglado. Lo renombré a su nombre original, se mantuvo fijo.
No tengo ninguna explicación de por qué funcionó, pero nos sacó de una sacudida seria.
Esto es lo que funcionó para mí:
Estaba usando Microsoft.IdentityModel.Clients.ActiveDirectory
versión 3.19 en un proyecto de biblioteca de clases, pero solo tenía instalada la versión 2.22 en el proyecto real de la aplicación web ASP.NET. La actualización a 3.19 en el proyecto de la aplicación web me ayudó a superar el error.
Estoy con Chris Conway en este (lo votó a favor). El problema es que está haciendo referencia a uno de los conjuntos telerik en su proyecto que hace referencia a otro que no está allí.
Lo primero: no instalaría CUALQUIER ensamblador de proveedor (es decir: telerik) en el GAC. Las cosas de Telerik se compilan en dos ensamblajes de todos modos (telerik.web.design y telerik.web.ui). Simplemente despliega aquellos con la aplicación.
En segundo lugar, en cada uno de sus archivos .proj (como .csproj) va a haber un <reference include..>
que apunta al archivo Telerik.Web.UI. Esto normalmente contiene un número de versión. Asegúrese de que el conjunto que coloca en la carpeta bin coincida con esa versión.
En tercer lugar, asegúrese de que TODOS sus proyectos utilicen el último ensamblaje. También asegúrese de que están tomando el ensamblaje de una ruta local en lugar de GAC. (Realmente no me gusta el GAC. Ha causado un sinfín de problemas en algunos proyectos en los que he participado). Normalmente tenemos una carpeta "Ensambles" que todos los proyectos usan para referencias de ensambles externos.
En cuarto lugar, visual studio busca automáticamente su gac cada vez que se carga un proyecto de sitio web y reorienta las ubicaciones de ensamblaje si encuentra algo en el gac. No puedo recordar si alguna vez hace esto para proyectos de aplicaciones web, pero no he tenido el problema en mucho tiempo con esos. Esto puede causar problemas similares durante la implementación.
En quinto lugar, puede volver a vincular números de versión para ensamblados en web.config. En la sección de runtime/assemblybinding
, puede usar algo como lo siguiente que lleva adelante cada conjunto de telerik desplegado en 2008 y lo apunta a una versión muy particular:
<dependentAssembly>
<assemblyIdentity name="Telerik.Web.UI" publicKeyToken="121fae78165ba3d4" />
<bindingRedirect oldVersion="2008.0.0.0-2020.0.0.0" newVersion="2010.02.0713.35" />
</dependentAssembly>
Intenté la mayoría de las respuestas, pero aún no pude hacerlo funcionar. Esto funcionó para mí:
haga clic derecho en referencia -> propiedades -> cambie ''Versión específica'' a falso.
Espero que esto ayude.
Mi problema era que los ensamblajes antiguos estaban en la carpeta _bin_deployableAssemblies en la aplicación web. Esto significaba que las antiguas asambleas estaban sobrescribiendo las asambleas del GAC al construir el proyecto.
Si experimenta este problema al probar y / o depurar la aplicación desde el entorno de Visual Studio (ASP.NET Development Server), es necesario eliminar todos los archivos temporales en la carpeta del sitio web de desarrollo. Para saber dónde está esa carpeta, busque el icono del Servidor de desarrollo ASP.NET en el icono de la bandeja de Windows (debe tener un título como este: Servidor de desarrollo ASP.NET - Puerto ####), haga clic con el botón secundario en el icono y seleccione Mostrar Detalles; Entonces, el campo Ruta física le dirá cuál es la carpeta temporal, todos los elementos deberían eliminarse para resolver el problema. Cree y ejecute de nuevo el sitio web y el problema debe resolverse (una vez más, resuelto para el entorno de desarrollo).
Supongo que otro ensamblaje que está utilizando hace referencia al dll antiguo. ¿Está familiarizado con todas las otras referencias de proyectos que se utilizan y alguna de ellas tiene una referencia a las dlls de Telerik?
¿Puedes poner una redirección vinculante en tu archivo web.config como este?
<dependentAssembly>
<assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/>
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
Tal vez esto ayude o tal vez no. Limpié mis versiones de depuración y lanzamiento, luego cambié el nombre de la carpeta OBJ. Esto finalmente me consiguió Thorugh. Los pasos anteriores consistían básicamente en eliminar referencias de proyectos y agregarlos nuevamente en las propiedades del proyecto.
Tenía el mismo mensaje cuando cambiaba entre dos versiones de una aplicación que hacía referencia a diferentes versiones de la misma DLL. Aunque estaba probando en diferentes carpetas, accidentalmente copié la versión más nueva sobre la versión anterior.
Entonces, lo primero que debe verificar es la versión de la DLL a la que se hace referencia en la carpeta de la aplicación. Por si acaso.
Tratar:
- limpiar archivos de proyectos temporales
- limpieza de compilación y archivos obj
- limpiar versiones antiguas instaladas en
C:/Users/USERNAME/.nuget/packages/
Eso funcionó para mí.
Tuve el mismo problema con diferentes ensamblajes que hacen referencia a diferentes versiones de Newtonsoft.json. La solución que funcionó para mí fue la ejecución del paquete de actualización desde Nuget Package Manager Console.
Tuve un problema similar y tuve que eliminar todo de las carpetas bin y obj y reconstruir para superar mi problema. Espero que esto ayude.