解决MSB3247 - 发现同一依赖程序集的不同版本之间存在冲突

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项目构建输出详细程度"更改为"详细"或更高版本.为此,请按照下列步骤操作:

  1. 打开"选项"对话框(" 工具" - >"选项...").
  2. 在左侧树中,选择" 项目和解决方案"节点,然后选择" 生成并运行".
    • 注意:如果此节点未显示,请确保选中" 显示所有设置 "对话框底部的复选框.
  3. 在出现的工具/选项页面中,根据您的版本将MSBuild项目构建输出详细级别设置为适当的设置:

  4. 构建项目并查看输出窗口.

查看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)

您不必打开每个程序集来确定引用程序集的版本.

  • 您可以检查每个参考的属性.
  • 打开项目属性并检查"引用"部分的版本.
  • 使用文本编辑器打开项目.
  • 使用.Net Reflector.

  • 赢得告诉人们实际使用输出窗口.构建比F5 +错误列表窗口更多. (53认同)
  • 提示:要在详细构建输出中找到确切位置,请将文本复制到文本编辑器中,搜索"找到相同依赖程序集的不同版本之间的冲突". (12认同)
  • 您的解决方案对我来说很好,但我认为使用"参考"部分查看版本号并不总是有用.我经常看到VS"谎言"我正在使用哪个版本与.csproj文件中实际提到的版本. (5认同)
  • @David Gardiner - 在使用C#项目时,我同意你的"撒谎"声明.根据我的经验,C#项目可能会对引用版本和编译/链接的实际版本感到困惑.发生这种情况时,我清理解决方案,手动删除bin和obj文件夹,然后删除%APPDATA%中的临时项目程序集.重建解决方案通常可以解决问题.(VB很少遇到这个特定的问题.) (5认同)
  • 作为ErikHeemskerk在他的回答中提到,在Visual Studio 2010中,您将需要输出详细程度设置为详细看ResolveAssemblyReferences的输出. (2认同)
  • 如果它是具有较低版本引用的第三方dll,该怎么办? (2认同)

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输出.

  • 谢谢你们的好话:) (11认同)

Jai*_*der 22

有时@AMissico回答是不够的.在我的情况下,我无法在输出窗口中找到错误,所以我决定创建一个日志文件并通过执行以下步骤进行分析:

  1. 将构建日志保存到文件... https://msdn.microsoft.com/en-us/library/ms171470.aspx

    msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed

  2. 找到文本:warning MS...或特定的警告信息:(例如第9293行)Found conflicts between different versions...,冲突错误的完整细节将在此消息的上方(例如第9277行)There was a conflicts between... 找到错误消息

Visual Studio 2013


Eri*_*erk 21

我发现(至少在Visual Studio 2010中)您需要将输出详细程度设置为至少详细以便能够发现问题.

可能是我的问题是以前作为GAC参考的引用,但在我的机器重新安装后不再是这种情况.


Car*_*rol 8

我有同样的错误,无法用其他答案搞清楚.我发现我们可以"整合"NuGet包.

  1. 右键单击解决方案
  2. 单击"管理Nuget包"
  3. 合并选项卡并更新到同一版本.


Rou*_*ouR 7

为默认的ASP.NET MVC 4 beta生成此警告, 请参见此处

在,可以通过手动编辑项目的.csproj文件来消除任何强制转换此警告.

修改........:参考包含="System.Net.Http"

阅读......:参考包含="System.Net.Http,Version = 4.0.0.0"


Man*_*dra 6

使用依赖性阅读器

使用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.

然后你可以选择

  • 说服lib的所有者使用相同的版本
  • 停止使用它们
  • 在配置文件中添加绑定重定向以使用最新版本

如何在Windows中运行这些东西

如果你没有一个UNIX型壳,你需要能够运行之前下载一个awkgrep.请尝试以下方法之一