Atualmente, estou desenvolvendo um aplicativo .NET, que consiste em 20 projetos. Alguns desses projetos são compilados usando o .NET 3.5, outros ainda são projetos do .NET 2.0 (até agora não há problema).
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 existe talvez a possibilidade de excluí-lo (como usar #pragma disable nos arquivos de código-fonte)?
Respostas:
Esse aviso significa que dois projetos fazem referência à mesma montagem (por exemplo
System.Windows.Forms
), mas os dois projetos exigem versões diferentes. Você tem poucas opções:Recompile todos os projetos para usar as mesmas versões (por exemplo, mova todos para .Net 3.5). Essa é a opção preferida porque todo o código está sendo executado com as versões das dependências com as quais foram compiladas.
Adicione um redirecionamento de ligação . Isso suprimirá o aviso. No entanto, seus projetos .Net 2.0 (em tempo de execução) serã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 em erro no Visual Studio.Use
CopyLocal=true
. Não tenho certeza se isso suprimirá o aviso. Como a opção 2 acima, isso significa 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:
fonte
Basicamente, isso acontece quando os assemblies aos quais 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 copiará também todas as dependências de um assembly referenciado, é possível terminar com duas compilações diferentes do mesmo assembly que estão sendo referidas. É mais provável que isso aconteça se seus projetos estiverem em soluções separadas e, portanto, podem ser compilados separadamente.
O jeito que eu consegui contornar isso é definir Copy Local como False para referências em projetos de montagem. Faça isso apenas para executáveis / aplicativos da web em que você precisa da montagem para a execução do produto acabado.
Espero que faça sentido!
fonte
Eu queria postar a solução da pauloya que eles forneceram nos comentários acima. Eu acredito que é a melhor solução para encontrar as referências ofensivas.
Por exemplo, quando você pesquisa "conflito" no painel de saída, pode encontrar algo parecido com isto:
Como você pode ver, há um conflito entre as versões 5 e 6 do EF.
fonte
update-package [your package name] -version 6.0.0 -reinstall
minha resposta aqui stackoverflow.com/questions/22685530/…Eu tive o mesmo problema com um dos meus projetos, no entanto, nenhuma das opções acima ajudou a resolver o aviso. Eu verifiquei o arquivo de log da compilação detalhada, usei o AsmSpy para verificar se usei as versões corretas para cada projeto na solução afetada, verifiquei as entradas reais de cada arquivo do 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 era referenciada diretamente de todos os outros projetos em minha solução. A atualização da referência no projeto referenciado resolveu-a.
Espero que o texto acima mostre o que quero dizer, demorei algumas horas para descobrir, então espero que outra pessoa também se beneficie.
fonte
No Visual Studio, se você clicar com o botão direito do mouse na solução e em Gerenciar pacotes de nuget, haverá uma guia "Consolidar" que define todos os pacotes para a mesma versão.
fonte
Acabei de receber esta mensagem de aviso, limpei a solução e recompilei (Build -> Clean Solution) e ela foi embora.
fonte
Eu tive o mesmo problema e resolvi alterando o seguinte em web.config.
Aconteceu comigo porque estou executando o aplicativo usando o Newtonsoft.Json 4.0
De:
Para:
fonte
Eu 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 correspondem 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 References - Properties indicará outra coisa.
Se você deseja atualizar suas dependências, faça o seguinte:
No Gerenciador de Soluções, clique com o botão direito do mouse no Projeto e clique em 'Gerenciar Pacotes de Nuget'
Selecione a guia 'Pacotes instalados' no painel esquerdo. Grave seus pacotes instalados. Você pode copiar primeiro o packages.config para a área de trabalho, se tiver muito, para poder verificar com o Google para verificar quais pacotes do Nuget estão instalados.
Desinstale seus pacotes. Tudo bem, vamos adicioná-los de volta.
Instale imediatamente os pacotes que você precisa. O que o Nuget fará não é apenas obter a versão mais recente, mas alterar suas referências e também adicionar os redirecionamentos de ligação para você.
Faça isso para todos os seus projetos.
No nível da solução, faça uma Limpeza e Reconstrução.
Você pode começar com os projetos mais baixos e seguir para os de nível superior e reconstruir cada projeto à medida que avança.
Se você não deseja atualizar suas dependências, pode usar o console do gerenciador de pacotes e usar a sintaxe Update-Package -ProjectName [yourProjectName] [nome do pacote] [packageName] -Version [versionNumber]
fonte
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 e versão diferente de outro componente em outro assembly.
Às vezes, isso acontece quando você usa "Procurar" para encontrar referências e adicionar a versão errada do assembly, ou você tem uma versão diferente do componente em seu repositório de códigos como a que você instalou na máquina local.
Tente descobrir quais projetos têm esses conflitos, remova os componentes da lista de referência e adicione-os novamente, certificando-se de que você está apontando para o mesmo arquivo.
fonte
=> verifique se haverá alguma instância do aplicativo instalada parcialmente.
=> primeiro desinstale essa instância do aplicativo de desinstalação.
=> limpe, reconstrua e tente implantar.
isso resolveu o meu problema. espero que também ajude você. Cumprimentos.
fonte
Também teve esse problema - no meu caso, foi causado por ter a propriedade "Versão específica" em várias referências definidas como true. Alterar isso para false nessas referências resolveu o problema.
fonte
Se você usasse o NuGet, tudo o que eu precisava fazer era:
clique com o botão direito do mouse no projeto e clique em Gerenciar pacotes NuGet.
clique na roda dentada no canto superior direito
clique na guia Geral no NuGet Package Manager acima das origens do pacote
marque "Ignorar Aplicando redirecionamentos de ligação" em Redirecionamentos de ligação
Limpe e reconstrua e o aviso se foi
Mole-mole
fonte
Passei algum tempo depurando o mesmo problema. Observe que esse problema pode não estar entre projetos diferentes, mas na verdade entre várias referências em um projeto que dependem de versões diferentes da mesma dll / assembly. No meu caso, o problema era referência
FastMember.dll
incompatibilidade de versões de que vem de dois pacotes NuGet diferentes em um único projeto. Quando recebi um projeto, ele não foi compilado porque os pacotes NuGet estavam ausentes e o VS se recusou a restaurar os pacotes ausentes. Através do menu NuGet, atualizo manualmente todos os NuGets para a versão mais recente, ou seja, quando o aviso aparece.No Visual Studio,
Tools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics.
procure as linhasThere was a conflict between
naOutput
janela. Abaixo está a parte da saída que recebi:Notar que
Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll"
ClosedXML.dll
vem doClosedXML
NuGet e dependeFastMember.dll 1.3.0.0
. Além disso, também háFastMember
Nuget no projeto, e ele possuiFastMember.dll 1.5.0.0
. Incompatibilidade!Eu desinstalei o
ClosedXML
&FastMember
NuGets, porque eu tinha redirecionamento de ligação e instalei apenas a versão mais recente doClosedXML
Isso corrigiu o problema!fonte
Isso aconteceu comigo também. Uma dll foi referenciada duas vezes: uma diretamente (em referências) e outra indiretamente (referenciada por outro projeto referenciado). Eu removi a referência direta, a solução limpa e reconstruída. Problema resolvido.
fonte
No meu caso, houve um problema com a referência do MySQL. De alguma forma, eu poderia listar três versões dele sob a lista de todas as referências disponíveis; para .net 2.0, .net 4.0 e .net 4.5. Eu segui o processo 1 a 6 acima e funcionou para mim.
fonte
Outra coisa a considerar e verificar é se você não tem nenhum serviço em execução que esteja usando essa pasta bin. se for parar o serviço e reconstruir a solução
fonte
Parece haver um problema no Mac Visual Studio ao editar arquivos .resx. 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 eram como se não tivessem sido editados. Então eu os editei, salvei e tudo começou a funcionar novamente no Mac também.
fonte
Eu tive esse problema quando meu projeto fez referência ao NETStandardLibrary e um dos assemblies referenciados foi publicado para o netcore. Apenas publicou como padrão de rede e o problema desapareceu
fonte
Aqui está a solução, estilo .NET Core 3.0: https://github.com/HTD/ref-check
Quando você descobrir quais conflitos, talvez você possa resolvê-los. Se as referências conflitantes forem de outros pacotes, você não terá sorte ou precisará usar fontes.
No meu caso, os pacotes conflitantes costumam ser meus, para que eu possa corrigir problemas de dependência e republicá-los.
fonte