.NET Framework – Could not load file or assembly, or one of its dependencies (como resolver?)

Categoria: Net Framework

Olá devs queridos! Hoje vamos conversar um pouco sobre assembly binding redirects. Esse erro do título é bem comum quando você tem o seguinte cenário: uma soluction com vários projetos e cada projetos com uma versão diferente de uma mesma dependência… Existe algumas formas de resolver isso. Vamos ver…

Como ocorre o erro e por que acontece isso?

Primeiro vamos ao cenário em que isso pode acontecer:

  • Aplicação .NET Framework abaixo de  4.7.2
  • Uma soluction com vários projetos
  • Uma mesma dependência com versões diferentes sendo usadas em projetos diferentes dentro da soluction

O que pode acontecer nesse cenário? Vamos imaginar que tenho um projeto usa a versão 10.0.0.0 do pacote Newtonsoft.Json. No web.config ou app.config vai ter uma linha mais ou menos assim:

<dependentAssembly>
    <assemblyIdentity Version=10.0.0.0 name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
</dependentAssembly>

O .NET runtime vai procurar a versão exata da dependência e quando encontrar carregar a mesma. Porém, se tiver outro projeto com uma versão 11 do pacote Newtonsoft.Json, dentro da mesma soluction, por exemplo, aí está o cenário do erro!

A lendária mensagem de erro que irá aparecer é algo parecido com isso: Could not load file or assembly ‘X, Version=X.X.X.X, Culture=neutral, PublicKeyToken=99999e999e99e9’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

1ª forma de resolver: deixar seus projetos com a mesma versão da dependência

Sei que isso pode não ser o cenário ideal para você, mas essa é uma solução definitiva. No nosso caso de exemplo, basicamente seria atualizar todos os projetos que estão dentro da soluction, que usam o pacote Newtonsoft.Json para passarem a usar a versão 11 do mesmo.

2ª forma de resolver:  redirect the assembly version

Para quem não pode atualizar todos os projetos para usar a mesma versão do pacote, a solução será configurar o web.config ou app.config para aceitar um range de versões. Você irá usar a configuração abaixo para indicar ao .NET runtime que quando ele encontrar a versão antiga (oldVersion) do seu pacote, ele deverá carregar a versão mais recente (newVersion).

No nosso exemplo seria assim:

<dependentAssembly>
  <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  <bindingRedirect oldVersion="10.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>

Você pode encontrar a documentação completa dessa solução no próprio site da Microsoft , clicando aqui.

Conclusão

Em resumo: se você ainda usa .Net Framework e está no cenário descrito no início deste artigo, em algum momento esse problema irá te “atormentar”. A boa é que a solução é bem simples de se aplicar. 🙂 Se você tiver outra solução, além das mencionadas acima, compartilhe na seção de comentário.

Grande abraço, pessoal!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *