Aviso:Conflitos encontrados entre diferentes versões do mesmo assembly dependente

StackOverflow https://stackoverflow.com/questions/17806

  •  09-06-2019
  •  | 
  •  

Pergunta

Atualmente estou desenvolvendo uma aplicação .NET, que consiste em 20 projetos.Alguns desses projetos são compilados usando .NET 3.5, outros ainda são projetos .NET 2.0 (até agora sem problemas).

O problema é que se eu incluir um componente externo sempre recebo o seguinte aviso:

"Found conflicts between different versions of the same dependent assembly".

O que exatamente esse aviso significa e talvez haja uma possibilidade de excluí-lo (como usar #pragma disable nos arquivos de código-fonte)?

Foi útil?

Solução

Este aviso significa que dois projetos fazem referência ao mesmo assembly (por exemplo, System.Windows.Forms), mas os dois projetos exigem versões diferentes.Você tem poucas opções:

  1. Recompile todos os projetos para usar as mesmas versões (por exemplomova tudo para .Net 3.5).Esta é a opção preferida porque todo o código está sendo executado com as versões das dependências com as quais foram compilados.

  2. Adicione um redirecionamento de ligação.Isso suprimirá o aviso.No entanto, seus projetos .Net 2.0 serão (em tempo de execução) vinculados às versões .Net 3.5 de assemblies dependentes, como System.Windows.Forms.Você pode adicionar rapidamente um redirecionamento de ligação clicando duas vezes no erro no Visual Studio.

  3. Usar CopyLocal=true.Não tenho certeza se isso suprimirá o aviso.Isso significará, como a opção 2 acima, que todos os projetos usarão a versão .Net 3.5 do System.Windows.Forms.

Aqui estão algumas maneiras de identificar as referências ofensivas:

  • Você pode usar um utilitário como o encontrado emhttps://gist.github.com/1553265
  • Outro método simples é definir a verbosidade da saída (ferramentas, opções, projetos e soluções, construir e executar, msbuild Project construir a verbosidade da saída, detalhada) e depois de construir, pesquise a janela de saída para o aviso e observe o texto logo acima dele . (Gorjeta do chapéu para Pauloya quem sugeriu isso nos comentários sobre esta resposta).

Outras dicas

Basicamente, isso acontece quando os assemblies que você está referenciando têm "Copy Local" definido como "True", o que significa que uma cópia da DLL é colocada na pasta bin junto com o seu exe.

Como o Visual Studio também copiará todas as dependências de um assembly referenciado, é possível que duas compilações diferentes do mesmo assembly sejam referenciadas.É mais provável que isso aconteça se seus projetos estiverem em soluções separadas e, portanto, puderem ser compilados separadamente.

A maneira como resolvi isso foi definir Copy Local como False para referências em projetos de montagem.Faça isso apenas para executáveis/aplicativos da web onde você precisa do assembly para a execução do produto final.

Espero que faça sentido!

Queria postar a solução do pauloya que eles forneceram nos comentários acima.Acredito que seja a melhor solução para encontrar as referências ofensivas.

A maneira mais simples de encontrar quais são as "referências ofensivas" é definir a verbosidade da saída de criação (ferramentas, opções, projetos e soluções, construir e executar, msbuild Project Build Said Verbosity, detalhado) e, após a construção, pesquise na janela de saída para o aviso.Veja o texto logo acima dele.

Por exemplo, ao pesquisar "conflito" no painel de saída, você poderá encontrar algo assim:

3>  There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3>      "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.

Como você pode ver, há um conflito entre as versões 5 e 6 do EF.

Tive o mesmo problema com um dos meus projetos, porém nenhuma das opções acima ajudou a resolver o aviso.Verifiquei o arquivo de log de construção detalhado, usei o AsmSpy para verificar se usei as versões corretas para cada projeto na solução afetada, verifiquei novamente as entradas reais em cada arquivo de projeto - nada ajudou.

Eventualmente descobriu-se que o problema era uma dependência aninhada de uma das referências que eu tinha em um projeto.Essa referência (A), por sua vez, exigia uma versão diferente de (B), que foi referenciada diretamente em todos os outros projetos da minha solução.Atualizar a referência no projeto referenciado resolveu o problema.

Solution A
+--Project A
   +--Reference A (version 1.1.0.0)
   +--Reference B
+--Project B
   +--Reference A (version 1.1.0.0)
   +--Reference B
   +--Reference C
+--Project C
   +--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)

Solution B
+--Project A
   +--Reference A (version 1.1.1.0)

Espero que o que foi dito acima mostre o que quero dizer, levei algumas horas para descobrir, então espero que outra pessoa também se beneficie.

No Visual Studio, se você clicar com o botão direito no solução e Gerenciar pacotes nuget há um "Consolidar" guia que define todos os pacotes para a mesma versão.

Acabei de receber esta mensagem de aviso e limpei a solução e recompilei (Build -> Clean Solution) e ela desapareceu.

Eu tive o mesmo problema e resolvi alterando o seguinte no web.config.

Aconteceu comigo porque estou executando o aplicativo usando Newtonsoft.Json 4.0

De:

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

Para:

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

Na verdade, isso depende do seu componente externo.Quando você faz referência a um componente externo em um aplicativo .NET, ele gera um GUID para identificar esse componente.Este erro ocorre quando o componente externo referenciado por um de seus projetos tem o mesmo nome, mas uma versão diferente, de outro componente em outra montagem.

Isso às vezes acontece quando você usa "Browse" para encontrar referências e adicionar a versão errada do assembly, ou você tem uma versão do componente em seu repositório de código diferente daquela que você instalou na máquina local.

Tente descobrir quais projetos apresentam esses conflitos, remova os componentes da lista de referência e adicione-os novamente, certificando-se de estar apontando para o mesmo arquivo.

Tenho outra maneira de fazer isso se você estiver usando o Nuget para gerenciar suas dependências.Descobri que às vezes o VS e o Nuget não combinam e o Nuget não consegue reconhecer que seus projetos estão fora de sincronia.O packages.config dirá uma coisa, mas o caminho mostrado em Referências - Propriedades indicará outra coisa.

Se você deseja atualizar suas dependências, faça o seguinte:

  1. Do Solution Explorer, clique com o botão direito do mouse no projeto e clique em 'Gerenciar pacotes Nuget'

  2. Selecione a guia 'Pacotes instalados' no painel esquerdo, registre seus pacotes instalados, você pode copiar seus pacotes.config para a sua área de trabalho primeiro, se tiver muito, para que você possa verificar com o Google para ver o que o NUGET PKGS está instalado

  3. Desinstale seus pacotes.Tudo bem, vamos adicioná-los de volta.

  4. Instale imediatamente os pacotes necessários.O que o Nuget fará não apenas fornecerá a versão mais recente, mas também alterará suas referências e também adicionará os redirecionamentos de ligação para você.

  5. Faça isso para todos os seus projetos.

  6. No nível da solução, faça uma limpeza e reconstrução.

Você pode querer começar com os projetos inferiores e avançar para os de nível superior, e reconstruir cada projeto à medida que avança.

Se não quiser atualizar suas dependências, você pode usar o console do gerenciador de pacotes e usar a sintaxe Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]

=> verifique se haverá alguma instância do aplicativo parcialmente instalada.

=> primeiro desinstale essa instância do aplicativo de desinstalação.

=> então, limpe, reconstrua e tente implantar.

isso resolveu meu problema. Espero que ajude você também.Atenciosamente.

Também tive esse problema - no meu caso, foi causado por ter a propriedade "Versão específica" em várias referências definida como verdadeira.Alterar para falso nessas referências resolveu o problema.

Isso aconteceu comigo também.Uma dll foi referenciada duas vezes:uma vez diretamente (nas referências) e uma vez indiretamente (referenciado por outro projeto referenciado).Removi a referência direta, limpei e reconstruí a solução.Problema resolvido.

  1. Abra o "Explorador de Soluções".
  2. Clique em "Mostrar todos os arquivos"
  3. Expanda "Referências"
  4. Você verá uma (ou mais) referências com ícones ligeiramente diferentes das demais.Normalmente, vem com uma caixa amarela sugerindo que você anote isso.Basta removê-lo.
  5. Adicione a referência novamente e compile seu código.
  6. Isso é tudo.

No meu caso, houve um problema com a referência do MySQL.De alguma forma, eu poderia listar três versões dele na lista de todas as referências disponíveis;para .net 2.0, .net 4.0 e .net 4.5.Segui os processos 1 a 6 acima e funcionou para mim.

Outra coisa a considerar e verificar é certificar-se de que não há nenhum serviço em execução que esteja usando essa pasta bin.se for, pare o serviço e reconstrua a solução

Parece haver um problema no Mac Visual Studio ao editar arquivos .resx.Eu realmente não sei o que aconteceu, mas tive esse problema assim que editei alguns arquivos .resx no meu Mac.Abri o projeto no Windows, abri os arquivos e eles estavam como se não tivessem sido editados.Então editei, salvei e tudo voltou a funcionar no Mac também.

Tive esse problema quando meu projeto tinha referência a NETStandardLibrary e um dos assemblies referenciados foi publicado para netcore.Acabei de publicar como netstandard e o problema desapareceu

Se estivesse usando o NuGet, tudo que eu precisava fazer era:

  1. clique com o botão direito do mouse no projeto e clique em Gerenciar pacotes NuGet.

  2. clique na engrenagem no canto superior direito

  3. clique na guia Geral no Gerenciador de pacotes NuGet acima de Fontes de pacotes

  4. marque "Ignorar aplicação de redirecionamentos de ligação" em Redirecionamentos de ligação

  5. Limpe e reconstrua e o aviso desapareceu

Mole-mole

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top