Dav*_*ner 422 .net msbuild clr ndepend
在使用msbuild进行编译时,.NET 3.5解决方案最终出现此警告.
有时NDepend可能有所帮助,但在这种情况下,它没有提供任何进一步的细节.像Bob一样,我最终不得不在ILDASM中打开每个程序集,直到找到引用旧版依赖程序集的程序集.
我确实尝试使用VS 2010 Beta 2中的MSBUILD(因为Connect文章表明这已经在下一版本的CLR中得到修复)但是它没有提供任何更多细节(可能在Beta 2后修复)
有更好的(更自动化的)方法吗?
AMi*_*ico 575
将"MSBuild项目构建输出详细程度"更改为"详细"或更高版本.为此,请按照下列步骤操作:
在出现的工具/选项页面中,根据您的版本将MSBuild项目构建输出详细级别设置为适当的设置:
查看MSBuild消息.该ResolveAssemblyReferences任务是MSB3247发起的任务,应该可以帮助您调试此特定问题.
我的具体情况是对SqlServerCe的错误引用.见下文.我有两个项目引用了两个不同版本的SqlServerCe.我用旧版本去了项目,删除了引用,然后添加了正确的引用.
Target ResolveAssemblyReferences:
Consider app.config remapping of assembly "System.Data.SqlServerCe, ..."
from Version "3.5.1.0" [H:\...\Debug\System.Data.SqlServerCe.dll]
to Version "9.0.242.0" [C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\System.Data.SqlServerCe.dll]
to solve conflict and get rid of warning.
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets :
warning MSB3247: Found conflicts between different versions of the same dependent assembly.
Run Code Online (Sandbox Code Playgroud)
您不必打开每个程序集来确定引用程序集的版本.
Noe*_*ams 133
Mike Hadlow 发布了一个名为AsmSpy的小控制台应用程序,它很好地列出了每个程序集的引用:
Reference: System.Net.Http.Formatting
4.0.0.0 by Shared.MessageStack
4.0.0.0 by System.Web.Http
Reference: System.Net.Http
2.0.0.0 by Shared.MessageStack
2.0.0.0 by System.Net.Http.Formatting
4.0.0.0 by System.Net.Http.WebRequest
2.0.0.0 by System.Web.Http.Common
2.0.0.0 by System.Web.Http
2.0.0.0 by System.Web.Http.WebHost
Run Code Online (Sandbox Code Playgroud)
这是一种更快速的方法来触及警告MSB3247的底部,而不是依赖于MSBuild输出.
Jai*_*der 22
有时@AMissico回答是不够的.在我的情况下,我无法在输出窗口中找到错误,所以我决定创建一个日志文件并通过执行以下步骤进行分析:
将构建日志保存到文件... https://msdn.microsoft.com/en-us/library/ms171470.aspx
msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed
找到文本:warning MS...或特定的警告信息:(例如第9293行)Found conflicts between different versions...,冲突错误的完整细节将在此消息的上方(例如第9277行)There was a conflicts between...

Visual Studio 2013
Eri*_*erk 21
我发现(至少在Visual Studio 2010中)您需要将输出详细程度设置为至少详细以便能够发现问题.
可能是我的问题是以前作为GAC参考的引用,但在我的机器重新安装后不再是这种情况.
使用dep.exe,您可以列出整个文件夹的所有嵌套依赖项.结合使用grep或awk等unix工具,它可以帮助您解决问题
$ dep | awk '{ print $1 " " $2; print $4 " " $5 }' | awk '{ if (length(versions[$1]) == 0) versions[$1] = $2; if (versions[$1] != $2) errors[$1] = $1; } END{ for(e in errors) print e } '
System.Web.Http
Run Code Online (Sandbox Code Playgroud)
这个不起眼的命令行运行dep.exe然后将输出管道两次到awk
$ dep myproject/bin | grep -i System\.Web\.Http
MyProject-1.0.0.0 >> System.Web.Http.Web-5.2.3.0 2 ( FooLib-1.0.0.0 )
MyProject-1.0.0.0 >> System.Web.Http.Web-4.0.0.0 2 ( BarLib-1.0.0.0 )
FooLib-1.0.0.0 > System.Web.Http.Web-5.2.3.0 1
BarLib-1.0.0.0 > System.Web.Http.Web-4.0.0.0 1
Run Code Online (Sandbox Code Playgroud)
在此示例中,该工具将向您显示System.Web.Http 5.2.3来自您对FooLib的依赖,而版本4.0.0来自BarLib.
然后你可以选择
如果你没有一个UNIX型壳,你需要能够运行之前下载一个awk和grep.请尝试以下方法之一