Como posso corrigir conflitos de versão do assembly com JSON.NET depois de atualizar as referências do pacote NuGet em um novo projeto ASP.NET MVC 5?

89

Eu criei um novo projeto da web ASP.NET MVC 5 no VS 2013 (Atualização 1) e atualizei todos os pacotes NuGet. Quando eu construo o projeto, recebo o seguinte aviso:

aviso MSB3243: Não há como resolver o conflito entre "Newtonsoft.Json, Versão = 6.0.0.0, Cultura = neutra, PublicKeyToken = 30ad4fe6b2a6aeed" e "Newtonsoft.Json, Versão = 4.5.0.0, Cultura = neutra, PublicKeyToken = 30ad4fe6b2a6aeed".

Quando eu verifico o web.config, no entanto, vejo que um redirecionamento de ligação está em vigor:

  <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 é exatamente o que o aviso informa.

Como posso corrigir esse aviso?

Jim Lamb
fonte
Sim, eu fiz uma reconstrução completa. Eu também atualizei o NuGet para o mais recente, criei uma nova solução e reproduzi exatamente o mesmo problema.
Jim Lamb

Respostas:

106

Aqui estão as etapas que usei para corrigir o aviso:

  • Descarregar projeto no VS
  • Editar arquivo .csproj
  • Pesquise todas as referências à montagem Newtonsoft.Json
    • Encontrados dois, um para v6 e um para v5
    • Substitua a referência a v5 por v6
  • Recarregar projeto
  • Construir e observar falha de referência de montagem
  • Veja as referências e veja que agora existem duas para Newtonsoft.Json. Remova o que não está resolvendo.
  • Reconstruir - sem avisos
Jim Lamb
fonte
12
Encontrei duas referências, uma para v6 e outra para v5, mas excluí (não substituí) a v5. Depois disso, não tive problemas como "falha de referência de montagem" ou duas referências a Newtonsoft.Json na IU. Estou supondo que alguém está entupidoinstall.ps1
ta.speot.is
Obrigado pela solução. Eu também apaguei a referência mais antiga do arquivo de projeto e não tive problemas.
Charles Prakash Dasari
31
+1 - Isso realmente me deixa louco quando eu tenho que fazer coisas assim. É por isso que sempre hesito em clicar em atualizar no gerenciador de pacotes nuget.
hylander0
1
Eu estava tendo esse problema e resolvi-o removendo a referência extra que não sabia que estava lá. Este é o link para o bug do Microsoft Connect que é a causa raiz da referência extra lá: connect.microsoft.com/VisualStudio/feedback/details/816725/… .
Martin Costello
1
No meu caso houve referências a duas versões diferentes do Newtonsoft.Json 11.0.1 e 11.0.2, embora estivesse reclamando da versão 6.0.
Daniel Lobo
31

Tive esse problema porque atualizei os pacotes, que incluíam o Microsoft.AspNet.WebApi que tem uma referência a Newtonsoft.Json 4.5.6 e já tinha a versão 6 instalada. Não foi inteligente o suficiente usar a versão 6.

Para resolver isso, após a atualização do WebApi, abri Ferramentas> Gerenciador de pacotes NuGet> Console do Pacakge Manager e executei:

 Update-Package Newtonsoft.Json

O log mostrou que as versões 6.0.xe 4.5.6 foram todas atualizadas para a mais recente e estava tudo bem.

Tenho a sensação de que isso vai acontecer novamente.

McGaz
fonte
1
Eu estava tendo o problema de várias versões diferentes em minha solução que contém vários projetos, isso corrigiu totalmente e atualizou tudo para o JSON.net mais recente. Agradável!
c0d3p03t
1
Essa foi a solução mais fácil e direta que resolveu meu problema. Obrigado!
youngrrrr
21

Descobri que excluir esta seção do arquivo de projeto para corrigir o problema.

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

Szmulder
fonte
É isso. Suponho que nenhum de Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5 corresponde ao redirecionamento de vinculação '' oldVersion = "0.0.0.0-6.0.0.0" '' Mas eu não sei como escrever um correto
fantastory
Este era o meu problema também, não tenho certeza do que o adicionou.
amnésia de
Funcionou para mim. Erro relacionado ao conflito entre v6.0 e v12.0. A referência do grupo de itens era a v11.0. Portanto, não tenho certeza do que está acontecendo, mas a remoção do grupo de itens parece ter resolvido isso, no que diz respeito à remoção do erro de compilação.
Brian.S
13

Se nenhuma das opções acima funcionar, tente usar em web.config ou 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
fonte
Isso é mais adequado para a situação em que você tem um projeto existente usando a versão superior e adiciona uma dependência que está usando uma versão mais antiga do mesmo pacote, então você redireciona a versão antiga para a nova.
Ismail Hawayel
13

Eu atualizei de Newtonsoft.Json 11.0.1 para 12.0.2. Abrindo o arquivo de projeto no Notepad ++ descobri ambos

<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>

e

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

Excluí o ItemGroup que envolve a referência com o caminho da dica para a versão 11.0.1.

Esses problemas podem ser extremamente frustrantes de encontrar. Além do mais, os desenvolvedores geralmente seguem as mesmas etapas das configurações de projeto anteriores. As configurações anteriores não encontraram o problema. Por alguma razão, o arquivo do projeto ocasionalmente é atualizado incorretamente.

Eu desejo desesperadamente que a Microsoft conserte esses problemas infernais de DLL de estúdio visual para que não apareçam. Isso acontece com muita frequência e faz com que o progresso seja interrompido até que seja consertado, geralmente por tentativa e erro.

Jeremy Ray Brown
fonte
1
Esse era exatamente o problema. Obrigado!
George Fabish
8

A solução final para seus erros de redirecionamento de montagem

Ok, espero que isso ajude a resolver quaisquer discrepâncias de referência de montagem (sã) ...

  1. Verifique o erro.

Navegue até o site

  1. Verifique web.config após o redirecionamento do assembly. Crie um se não existir.

Redirecionamento de assembly web.config existente

  1. Clique com o botão direito na referência da montagem e escolha Propriedades.

Montagem na lista de referência, no projeto relevante

  1. Verifique a versão (não a versão do tempo de execução) na tabela Propriedades. Entendido.

Tabela de propriedades mostrando a versão da montagem

  1. Cole no atributo newVersion.

web.config assembly redireciona com newVersion atualizado

  1. Por conveniência, altere a última parte da versão antiga para algo alto, redondo e imaginário.

web.config assembly redireciona com oldVersion atualizado

Alegrar.


fonte
Essa resposta me salvou muito! Eu tinha um aplicativo da web que usava uma biblioteca C # customizada, ambos usavam o mesmo pacote nuget, mas o aplicativo da web tem uma versão mais antiga que a biblioteca e o redirecionamento não incluía a versão que a biblioteca estava usando.
War Gravy
4

Lembre-se de que com o redirecionamento de ligação

oldVersion = "0.0.0.0-6.0.0.0"

Você está dizendo que as versões antigas da dll estão entre a versão 0.0.0.0 e a versão 6.0.0.0.

Sherlock-jr
fonte
1
oldVersioné um pouco incorreto aqui, na verdade, o que você está dizendo é que seu assembly / exe foi construído com uma referência a uma versão no intervalo 0.0.0.0-6.0.0.0e que a versão realmente instalada (e preferida) é o valor em newVersion(versão antiga seria melhor redigida como "versão esperada" e a nova versão seriam melhor expressas como "versão disponível real")
nada é necessário
2

Ninguém mencionou o seguinte, que em meu entender é a solução correta:

Vá para o csproj do projeto onde o nuget está instalado e defina AutoGEneratedBindingRedirectscomo false.

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

Artigo completo no MSDN.

Veverke
fonte
1

Eu atualizei meu pacote e até o reinstalei - mas ainda estava recebendo exatamente o mesmo erro que o OP mencionado. Eu editei manualmente a dll referenciada fazendo o seguinte.

Removi o newtonsoft.json.dll da minha referência e, em seguida, apaguei manualmente o .dll do diretório bin. Em seguida, copiei manualmente o newtonsoft.json.dll da pasta do pacote nuget para o compartimento do projeto e adicionei a referência navegando até o arquivo .dll.

Agora meu projeto é construído novamente.

Adam Heeg
fonte
0

Eu tive um problema semelhante e só queria postar uma resposta para outras pessoas na minha situação.

Eu tenho uma solução executando um aplicativo da Web ASP.NET com vários outros projetos de biblioteca de classe C #.

Meu aplicativo da Web ASP.NET não estava usando json, mas outros projetos onde.

Foi assim que eu consertei:

  1. Certifiquei-me de que todos os projetos estavam usando a versão mais recente (6) usando NuGet Update em todos os projetos atualmente usando qualquer versão do json - isso não corrigiu o problema
  2. Adicionei json ao aplicativo da web usando NuGet - isso corrigiu o problema (deixe-me mergulhar no porquê):

O passo 2 foi antes de mais nada adicionar uma informação de configuração para json, que sugere que todos os projetos, usem a versão mais recente (6), não importa qual versão eles tenham. Adicionar a associação de montagem ao Web.Config é provavelmente a solução.

No entanto, a etapa 2 também limpou algum código legado. Descobrimos que usamos anteriormente uma versão antiga (5) do json em nosso aplicativo da Web e as pastas NuGet não foram excluídas quando a referência foi (eu suspeito: manualmente) removida. Adicionando o json (6) mais recente, removeu as pastas antigas (json v5). Isso também pode fazer parte da correção.

Nick Niebling
fonte
0

Veverke mencionou que é possível desativar a geração de redirecionamentos de vinculação definindo AutoGEneratedBindingRedirects como false. Não tenho certeza se é uma coisa nova desde que esta pergunta foi postada, mas há uma opção "Ignorar a aplicação de redirecionamentos de vinculação" em Ferramentas / Opções / Gerenciador de Pacotes Nuget, que pode ser alternada. Por padrão, ele está desligado, o que significa que os redirecionamentos serão aplicados. No entanto, se você fizer isso, terá que gerenciar manualmente os redirecionamentos de ligação necessários.

Svein Terje Gaup
fonte