Uma solução .NET 3.5 terminou com esse aviso ao compilar com o msbuild.
Às vezes, o NDepend pode ajudar, mas nesse caso não fornece mais detalhes. Como Bob , acabei tendo que recorrer à abertura de cada assembly no ILDASM até encontrar o que estava fazendo referência a uma versão mais antiga do assembly dependente.
Tentei usar o MSBUILD do VS 2010 Beta 2 (como o artigo do Connect indicou que isso foi corrigido na próxima versão do CLR), mas também não forneceu mais detalhes (talvez corrigido após o Beta 2)
Existe uma abordagem melhor (mais automatizada)?
Respostas:
Altere a "verbosidade de saída da compilação do projeto MSBuild" para "Detalhada" ou acima. Para fazer isso, execute as seguintes etapas:
Na página de ferramentas / opções exibida, defina o nível de verbosidade de saída da compilação do projeto MSBuild para a configuração apropriada, dependendo da sua versão:
Confira as mensagens do MSBuild. A
ResolveAssemblyReferences
tarefa, da qual o MSB3247 se origina, deve ajudá-lo a depurar esse problema específico.Meu caso específico foi uma referência incorreta ao SqlServerCe. Ver abaixo. Eu tinha dois projetos referenciando duas versões diferentes do SqlServerCe. Fui ao projeto com a versão mais antiga, removi a referência e adicionei a referência correta.
Você não precisa abrir cada montagem para determinar as versões de montagens referenciadas.
fonte
Mike Hadlow postou um pequeno aplicativo de console chamado AsmSpy que lista bastante as referências de cada assembly:
Essa é uma maneira muito mais rápida de chegar ao final do aviso MSB3247, do que depender da saída do MSBuild.
fonte
Em algum momento a resposta do @AMissico não é suficiente. No meu caso, como não encontrei o erro nas janelas Saída, decidi criar um arquivo de log e analisá-lo, executando as seguintes etapas:
Salvando o log de compilação em um arquivo ... https://msdn.microsoft.com/en-us/library/ms171470.aspx
msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed
Encontre o texto:
warning MS...
ou as informações de aviso específicas: (por exemplo, linha 9293)Found conflicts between different versions...
e os detalhes completos do erro de conflito estarão acima desta mensagem (por exemplo, linha 9277)There was a conflicts between...
Visual Studio 2013
fonte
Descobri que (pelo menos no Visual Studio 2010) você precisa definir a verbosidade de saída como pelo menos Detalhada para poder detectar o problema.
Pode ser que meu problema tenha sido uma referência anterior ao GAC, mas esse não era mais o caso após a reinstalação da máquina.
fonte
Eu tive o mesmo erro e não consegui descobrir com as outras respostas. Descobri que podemos "consolidar" pacotes NuGet.
fonte
Este aviso gerado para o ASP.NET MVC 4 beta padrão, consulte aqui
fonte
Use um leitor de dependência
Usando dep.exe você pode listar todas as dependências aninhadas de uma pasta inteira. Combinado com ferramentas unix como grep ou awk, ele pode ajudá-lo a resolver seu problema
Localizando montagens sendo referenciadas em mais de uma versão
Essa linha de comando obscura executa dep.exe e envia a saída duas vezes para ativar
Entendendo como essa montagem foi puxada para sua lixeira
Neste exemplo, a ferramenta mostraria que o System.Web.Http 5.2.3 vem da sua dependência do FooLib, enquanto a versão 4.0.0 vem do BarLib.
Então você tem a escolha entre
Como executar essas coisas no Windows
Se você não tem um tipo de shell unix você precisará baixar um antes de ser capaz de executar
awk
egrep
. Tente um dos seguintesfonte
Eu também tive esse problema e usei o conselho de AMissico para descobrir o problema (embora tenha que definir o nível de verbosidade como Detalhado.
O problema foi bastante simples, depois de encontrar o culpado.
Antecedentes: atualizei meu projeto do VS2008 para o VS2010. No VS2008, a estrutura de destino era 3,5 e, quando a trouxe para o VS2010, mudei para 4 (Completo). Também atualizei alguns componentes de terceiros, incluindo Crystal Reports.
Ele resultou na maioria das referências do sistema, apontando para a versão 4.0.0.0, mas algumas não foram alteradas automaticamente (System e System.Web.Services) e ainda estavam na 2.0.0.0. O Crystal Reports está fazendo referência à 4.0.0.0 e, portanto, era nesse ponto que os conflitos estavam ocorrendo. Basta colocar o cursor na primeira biblioteca do sistema no gerenciador de soluções, percorrer o cursor da lista e procurar por referências ao 2.0.0.0, remover e adicionar novamente a versão mais recente do 4.0.0.0.
O estranho era que a maioria das referências havia sido atualizada corretamente e, se não fosse pelos relatórios do Crystal, eu provavelmente nunca teria notado ...
fonte
Eu fiz um aplicativo baseado no aplicativo Mike Hadlow: AsmSpy .
Meu aplicativo é um aplicativo WPF com GUI e pode ser baixado no meu servidor Web doméstico: AsmSpyPlus.exe .
O código está disponível em: GitHub
fonte
Como mencionado aqui , você precisa remover as referências não utilizadas e os avisos serão exibidos.
fonte
O gerenciador de compilação do ASP.NET está construindo o site, percorrendo as pastas em ordem alfabética e, para cada pasta, descobre as dependências e cria as dependências primeiro e depois a pasta selecionada.
Nesse caso, a pasta problemática que é ~ / Controls é selecionada para ser criada no início, por um motivo ainda desconhecido, ela cria alguns dos controles lá como um assembly separado, em vez de dentro do mesmo assembly que outros controles (parece estar conectado ao fato de que alguns controles dependem de outros na mesma pasta).
Em seguida, a próxima pasta criada (~ / Centro de Arquivos / Controle) depende da pasta raiz ~ / que depende de ~ / Controls, portanto, a pasta ~ / Controls está sendo criada novamente somente desta vez os controles que foram separados Agora, a sua própria montagem agora está unida à mesma montagem que outros controles com a montagem separada ainda sendo referenciada.
Portanto, neste ponto, a montagem 2 (pelo menos) tem os mesmos controles e a compilação falha.
Embora ainda não saibamos por que isso aconteceu, fomos capazes de contorná-la alterando o nome da pasta Controls para ZControls, dessa forma, ela não foi criada antes do ~ / File-Center / Control, somente depois e dessa forma. Como deveria.
fonte
Conserto rápido:
Clique com o botão direito do mouse em solução -> Gerenciar pacotes NuGet para solução -> em Consolidar, você pode ver se há versões diferentes do mesmo pacote instaladas. Desinstale versões diferentes e instale a mais recente.
fonte
Às vezes
AutoGenerateBindingRedirects
não é suficiente (mesmo comGenerateBindingRedirectsOutputType
). Procurar todas asThere was a conflict
entradas e corrigi-las manualmente uma a uma pode ser entediante, por isso escrevi um pequeno pedaço de código que analisa a saída do log e as gera para você (despeja parastdout
):Dica: use Visualizador de Log Estruturado e Binário do MSBuild gere apenas redirecionamentos de ligação para os conflitos no projeto que emite o aviso (ou seja, apenas passe essas
there was a conflict
linhas para o arquivo de texto de entrada para o código acima [AssemblyConflicts.txt
]).fonte
Uma maneira mais simples, sem que se leve em consideração as dependências (internas):
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. Eu segui o processo 1 a 6 acima e funcionou para mim.
fonte
Além da Comunidade do Visual Studio para Mac:
Como a resposta do AMissico exige a alteração do nível do log, e nem o ASMSpy nem o ASMSpyPlus estão disponíveis como uma solução de plataforma cruzada, aqui está uma pequena adição ao Visual Studio para Mac:
Está na Comunidade do Visual Studio → Preferências ... → Projetos → Log de Compilação → verbosidade
fonte
Se você tiver um afiador novamente, remova todas as referências não utilizadas na sua solução.
fonte