解决MSB3247 – 在同一个相关程序集的不同版本之间发现冲突

在使用msbuild编译时,.NET 3.5解决scheme最终会出现此警告。

有时NDepend可能会帮忙,但在这种情况下,它没有提供任何进一步的细节。 像Bob一样,我不得不打开ILDASM中的每个程序集,直到find引用相关程序集旧版本的程序。

我曾尝试使用VS 2010 Beta 2中的MSBUILD(因为Connect文章指出这已在下一个版本的CLR中修复),但是并没有提供更多的细节(可能是Beta 2的固定版本)

有更好的(更自动的)方法吗?

将“MSBuild项目生成输出详细”更改为“详细”或以上。 要这样做,请按照下列步骤操作:

  1. 调出选项对话框( 工具 – >选项… )。
  2. 在左侧的树中,selectProjects and Solutions节点,然后selectBuild and Run
    • 注意:如果这个节点没有显示,请确保选中对话框显示所有设置底部的checkbox。
  3. 在显示的工具/选项页面中,根据您的版本,将MSBuild项目生成输出详细级别设置为适当的设置:

    • 在VS2012,VS2013或VS2015上进行诊断 (这些版本中的消息您应该使用“详细”, 但这是明显错误的,您应该使用“诊断” )
    • 当你在VS2010上详细说明
    • 正常将足以在VS2008或更旧的。
  4. 构build项目并查看输出窗口。

查看MSBuild消息。 ResolveAssemblyReferences任务(这是MSB3247的来源)将帮助您debugging此特定问题。

我的具体情况是对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. 

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

  • 您可以检查每个参考的属性。
  • 打开项目属性并检查“参考”部分的版本。
  • 用文本编辑器打开项目。
  • 使用.Netreflection器。

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 

这是到MSB3247警告底部的一种更快的方法,而不是依赖于MSBuild输出。

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

这可能是我的问题曾经是一个GAC参考的参考,但是我的机器重新安装后不再是这种情况。

有时@AMISSico答案是不够的。 在我的情况下,我无法find输出窗口中的错误,所以我决定创build一个日志文件并分析它,通过执行以下步骤:

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

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

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

Visual Studio 2013

这个默认的ASP.NET MVC 4testing版生成的警告请看这里

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

修改……..:引用Include =“System.Net.Http”

阅读……:引用Include =“System.Net.Http,Version = 4.0.0.0”

使用依赖关系阅读器

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

这个隐蔽的命令行运行dep.exe,然后pipe理输出两次awk

  • 把父母和孩子放在一个列中(默认情况下,每行包含一个父母和一个孩子来表示这个父母依赖那个孩子的事实)
  • 然后用一个关联数组做一种“group by”

了解这个组件如何被拉进垃圾桶

 $ 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 

在这个例子中,该工具会告诉你,System.Web.Http 5.2.3来自你的依赖到FooLib,而版本4.0.0来自BarLib。

那么你有select之间

  • 说服这些库的所有者使用相同的版本
  • 停止使用一个他们
  • 在configuration文件中添加绑定redirect以使用最新版本

如何在Windows中运行这些东西

如果你没有unixtypes的shell,你需要先下载一个才能运行awkgrep 。 尝试以下方法之一

  • cmder + awk + dep.exe
  • gitbash + awk + dep.exe
  • cygwin + dep.exe

我也有这个问题,并使用AMissico的build议也发现问题(虽然不得不将详细级别设置为详细。

这个问题实际上是相当直截了当的,虽然find了罪魁祸首。

背景:我将我的项目从VS2008升级到VS2010。 在VS2008的目标框架是3.5,当我把它带到VS2010我把它切换到4(全)。 我还升级了一些第三方组件,包括Crystal报表。

事实certificate,大多数的系统引用指向4.0.0.0版本,但有一对还没有被自动更改(系统和System.Web.Services),仍然看着2.0.0.0。 Crystal报告引用4.0.0.0,所以这是冲突发生的地方。 只需将光标放在解决scheme资源pipe理器中的第一个系统库上,将光标放在列表中,查找对2.0.0.0的任何引用,删除并重新添加新的4.0.0.0版本就可以了。

奇怪的是,大部分的引用已被正确更新,如果不是Crystal的报告,我可能永远不会注意到…

在这里find了一些东西,它帮助了我,只是删除未使用的引用,警告将会消失。

我做了一个基于Mike Hadlow应用程序的应用程序:AsmSpy 。

我的应用程序是一个带有GUI的WPF应用程序,可以从我的家庭networking服务器上下载: AsmSpyPlus.exe 。

代码位于: GitHub

桂样本

我有同样的错误,不能解决与其他答案。 我发现我们可以“整合”NuGet包。

  1. 右键点击解决scheme
  2. 点击pipe理Nuget包
  3. 合并选项卡并更新到相同的版本。

ASP.NET构buildpipe理器通过按字母顺序遍历文件夹来构build网站,并为每个文件夹找出它的依赖关系,并首先构build依赖关系,然后构build所选文件夹。

在这种情况下,〜/ Controls这个有问题的文件夹被select为在开始时被构build,但是从一个未知的原因,它将一些控件构build为一个单独的程序集,而不是像其他控件一样在同一个程序集中被连接到一些控件依赖于同一文件夹中的其他控件的事实)。

然后build立的下一个文件夹(〜/文件中心/控制)取决于依赖〜/控制的根文件夹〜/,所以文件夹〜/控件正在被重新构build,只是这次被分离的控件到他们自己的组装现在被连接到与其他控件相同的组件,而分离的组件仍被引用。

所以在这一点上,2个程序集(至less)具有相同的控件,构build失败。

虽然我们仍然不知道为什么会发生这种情况,但是我们可以通过将Controls文件夹名称更改为ZControls来解决这个问题,这种方式不是在〜/ File-Center / Control之前build立的,只能在这之后正如它应该。

快速解决:

右键单击解决scheme – >pipe理解决scheme的NuGet包 – >在Consolidate下 ,可以看到是否安装了相同包的不同版本。 卸载不同的版本并安装最新版本。

没有考虑(内部)依赖关系的最简单的方法:

  1. 打开“解决scheme浏览器”。
  2. 点击“显示所有文件”
  3. 展开“参考”
  4. 您会看到一个(或多个)参考图标,其图标略有不同。 通常情况下,黄箱表示你记下它。 只要删除它。
  5. 添加参考返回并编译您的代码。
  6. 就这样。

在我的情况下,MySQL参考有一个问题。 不知何故,我可以列出所有可用参考列表下的三个版本。 我遵循上面的过程1到6,它为我工作。