¿Cómo puedo solucionar los conflictos de la versión de ensamblado con JSON.NET después de actualizar las referencias del paquete NuGet en un nuevo proyecto ASP.NET MVC 5?

89

Creé un nuevo proyecto web ASP.NET MVC 5 en VS 2013 (Actualización 1) y luego actualicé todos los paquetes NuGet. Cuando construyo el proyecto, recibo la siguiente advertencia:

advertencia MSB3243: No hay forma de resolver el conflicto entre "Newtonsoft.Json, Versión = 6.0.0.0, Cultura = neutral, PublicKeyToken = 30ad4fe6b2a6aeed" y "Newtonsoft.Json, Versión = 4.5.0.0, Cultura = neutral, PublicKeyToken = 30ad4fe6b2a6aeed".

Sin embargo, cuando reviso web.config, veo que hay una redirección vinculante en su lugar:

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
  </dependentAssembly>

Que es exactamente lo que aconseja la advertencia.

¿Cómo puedo solucionar esta advertencia?

Jim Lamb
fuente
Sí, hice una reconstrucción completa. También actualicé NuGet a la última versión, creé una nueva solución y reproduje exactamente el mismo problema.
Jim Lamb

Respuestas:

106

Aquí los pasos que utilicé para corregir la advertencia:

  • Descargar proyecto en VS
  • Editar archivo .csproj
  • Busque todas las referencias al ensamblaje Newtonsoft.Json
    • Encontré dos, uno para v6 y otro para v5
    • Reemplace la referencia a v5 con v6
  • Recargar proyecto
  • Construir y notar falla de referencia de ensamblado
  • Vea las referencias y vea que ahora hay dos para Newtonsoft.Json. Elimine el que no se resuelve.
  • Reconstruir - sin advertencias
Jim Lamb
fuente
12
Encontré dos referencias, una para v6 y otra para v5, pero eliminé (no reemplacé) la v5. Después de eso, no tuve ningún problema como "falla de referencia de ensamblado" o dos referencias a Newtonsoft.Json en la interfaz de usuario. Estoy adivinando que alguien tapadainstall.ps1
ta.speot.is
Gracias por la solucion Yo también eliminé la referencia anterior del archivo del proyecto y no tuve problemas.
Charles Prakash Dasari
31
+1 - Realmente me vuelve loco cuando tengo que hacer cosas como esta. Es por eso que siempre dudo en hacer clic en actualizar en el administrador de paquetes nuget.
hylander0
1
Tenía este problema y lo solucioné eliminando la referencia adicional que no sabía que estaba allí. Este es el enlace al error de Microsoft Connect que es la causa principal de la referencia adicional que está allí: connect.microsoft.com/VisualStudio/feedback/details/816725/… .
Martin Costello
1
En mi caso, hubo referencias a dos versiones diferentes de Newtonsoft.Json 11.0.1 y 11.0.2, aunque se quejaba de la versión 6.0.
Daniel Lobo
31

Tuve este problema porque actualicé los paquetes, que incluían Microsoft.AspNet.WebApi que tiene una referencia a Newtonsoft.Json 4.5.6 y ya tenía instalada la versión 6. No fue lo suficientemente inteligente como para usar la versión 6.

Para resolverlo, después de la actualización de WebApi, abrí Herramientas> Administrador de paquetes NuGet> Consola del administrador de Pacakge y ejecuté:

 Update-Package Newtonsoft.Json

El registro mostró que las versiones 6.0.xy 4.5.6 se actualizaron a la última versión y todo estaba bien.

Tengo la sensación de que esto volverá a surgir.

McGaz
fuente
1
Estaba teniendo el problema de múltiples versiones diferentes en mi solución que contiene múltiples proyectos, esto lo solucionó totalmente y actualizó todo al último JSON.net. ¡Agradable!
c0d3p03t
1
Esta fue la solución más sencilla y directa que solucionó mi problema. ¡Gracias!
youngrrrr
21

Encontré eliminar esta sección del archivo del proyecto para solucionar el problema.

<ItemGroup>
<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>

szmulder
fuente
Eso es todo. Supongo que ninguno de Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5 coincide con la redirección de enlace '' oldVersion = "0.0.0.0-6.0.0.0" '' Pero no sé cómo escribir uno correcto
fantastory
Este también fue mi problema, no estoy seguro de qué lo agregó.
amnesia
Trabajó para mi. Error relacionado con el conflicto entre v6.0 y v12.0. La referencia del grupo de elementos era la v11.0. Entonces, no estoy seguro de lo que está sucediendo, pero la eliminación del grupo de elementos parece haberlo resuelto, en cuanto a eliminar el error de compilación.
Brian.S
13

Si nada de lo anterior funciona, intente usar esto en web.config o app.config:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
ZeroDotNet
fuente
Esto es más adecuado para la situación en la que tiene un proyecto existente que usa la versión superior y agrega una dependencia que usa una versión anterior del mismo paquete, por lo que redirige la versión anterior a la nueva.
Ismail Hawayel
13

Actualicé de Newtonsoft.Json 11.0.1 a 12.0.2. Al abrir el archivo del proyecto en Notepad ++, descubrí tanto

<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>

y

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

Eliminé ItemGroup que envuelve la referencia con la ruta de la pista a la versión 11.0.1.

Estos problemas pueden ser increíblemente frustrantes de encontrar. Además, los desarrolladores suelen seguir los mismos pasos que las configuraciones de proyectos anteriores. Las configuraciones anteriores no encontraron el problema. Por alguna razón, el archivo del proyecto ocasionalmente se actualiza incorrectamente.

Desearía desesperadamente que Microsoft solucionara estos problemas del infierno de DLL de estudio visual para que no aparezcan. Ocurre con demasiada frecuencia y hace que el progreso se detenga hasta que se solucione, a menudo mediante prueba y error.

Jeremy Ray Brown
fuente
1
Este era exactamente el problema. ¡Gracias!
George Fabish
8

La solución final a los errores de redireccionamiento de su ensamblaje

De acuerdo, con suerte esto debería ayudar a resolver cualquier (sana) discrepancia de referencia de ensamblaje ...

  1. Verifique el error.

Navegar por el sitio web

  1. Compruebe web.config después de la redirección del ensamblado. Cree uno si no existe.

Redireccionamiento del ensamblado web.config existente

  1. Haga clic con el botón derecho en la referencia del ensamblaje y elija Propiedades.

Montaje en la lista de referencia, en el proyecto correspondiente

  1. Verifique la versión (no la versión en tiempo de ejecución) en la tabla Propiedades. Entendido.

Tabla de propiedades que muestra la versión del ensamblaje

  1. Pegue en el atributo newVersion.

redireccionamiento de ensamblado web.config con newVersion actualizado

  1. Por conveniencia, cambie la última parte de la versión antigua por algo alto, redondo e imaginario.

redireccionamiento de ensamblado web.config con versión antigua actualizada

Alegrarse.


fuente
¡Esta respuesta me salvó mucho! Tenía una aplicación web que usaba una biblioteca C # personalizada, ambas usaban el mismo paquete nuget pero la aplicación web tiene una versión anterior a la biblioteca y la redirección no incluía la versión que estaba usando la biblioteca.
War Gravy
4

Recuerda que con la redirección vinculante

oldVersion = "0.0.0.0-6.0.0.0"

Está diciendo que las versiones anteriores de la dll están entre la versión 0.0.0.0 y la versión 6.0.0.0.

Sherlock-jr
fuente
1
oldVersionEn realidad, es un nombre poco apropiado aquí, lo que está diciendo es que su ensamblado / exe se creó con una referencia a una versión en el rango 0.0.0.0-6.0.0.0y que la versión realmente instalada (y preferida) es el valor debajo newVersion(la versión anterior estaría mejor redactada como "versión esperada" y la nueva versión estaría mejor redactada como "versión real disponible")
nada es necesario
2

Nadie mencionó lo siguiente, que a mi entender es la solución correcta:

Vaya al csproj del proyecto donde está instalado el nuget y establezca AutoGEneratedBindingRedirectsen false.

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

Artículo completo en MSDN.

Veverke
fuente
1

Actualicé mi paquete e incluso lo reinstalé, pero todavía recibía exactamente el mismo error que el OP mencionado. Edité manualmente el dll referenciado haciendo lo siguiente.

Eliminé el newtonsoft.json.dll de mi referencia, luego eliminé manualmente el .dll del directorio bin. Luego copié manualmente el newtonsoft.json.dll de la carpeta del paquete nuget en el contenedor del proyecto, luego agregué la referencia navegando en el archivo .dll.

Ahora mi proyecto se vuelve a construir.

Adam Heeg
fuente
0

Tuve un problema similar y solo quería publicar una respuesta para otras personas en mi situación.

Tengo una solución que ejecuta una aplicación web ASP.NET con varios otros proyectos de biblioteca de clase C #.

Mi aplicación web ASP.NET no estaba usando json, pero otros proyectos donde.

Así es como lo arreglé:

  1. Me aseguré de que todos los proyectos usaran la última versión (6) usando NuGet Update en todos los proyectos que actualmente usan cualquier versión de json; esto no solucionó el problema
  2. Agregué json a la aplicación web usando NuGet; esto solucionó el problema (permítanme profundizar en el motivo):

El paso 2 fue, en primer lugar, agregar una información de configuración para json, que sugiere que todos los proyectos usen la última versión (6) sin importar la versión que tengan. Lo más probable es que agregue el enlace de ensamblado a Web.Config.

Sin embargo, el paso 2 también limpió algunos códigos heredados. Resultó que anteriormente habíamos usado una versión anterior (5) de json en nuestra aplicación web y las carpetas de NuGet no se eliminaron cuando se eliminó la referencia (sospecho: manualmente). Agregando el último json (6), eliminó las carpetas antiguas (json v5). Esto también podría ser parte de la solución.

Nick Niebling
fuente
0

Veverke mencionó que es posible deshabilitar la generación de redirecciones vinculantes estableciendo AutoGEneratedBindingRedirects en falso. No estoy seguro si es algo nuevo desde que se publicó esta pregunta, pero hay una opción "Omitir la aplicación de redireccionamientos vinculantes" en Herramientas / Opciones / Administrador de paquetes Nuget, que se puede alternar. De forma predeterminada, está desactivado, lo que significa que se aplicarán las redirecciones. Sin embargo, si hace esto, tendrá que administrar manualmente los redireccionamientos de enlace necesarios.

Svein Terje Gaup
fuente