. net 3.5解决方案在使用msbuild编译时出现此警告。

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

我确实尝试使用VS 2010 Beta 2的MSBUILD(连接文章指出这在CLR的下一个版本中得到了修复),但也没有提供更多的细节(可能是在Beta 2后修复的)。

有没有更好的(更自动化的)方法?


当前回答

我也有这个问题,并使用了AMissico的建议,发现了这个问题(尽管必须将冗长级别设置为详细。

在找到罪魁祸首后,问题其实很简单。

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

结果发现大多数系统引用指向4.0.0.0版本,但有几个没有自动更改(System和System. web . services),仍然指向2.0.0.0版本。水晶报告引用4.0.0.0,所以这是冲突发生的地方。只需将光标放在解决方案资源管理器中的第一个System库上,向下移动列表并查找对2.0.0.0的任何引用,删除并重新添加新的4.0.0.0版本就可以了。

奇怪的是,大多数参考文献都被正确更新了,如果不是水晶报告,我可能永远都不会注意到……

其他回答

我也有这个问题,并使用了AMissico的建议,发现了这个问题(尽管必须将冗长级别设置为详细。

在找到罪魁祸首后,问题其实很简单。

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

结果发现大多数系统引用指向4.0.0.0版本,但有几个没有自动更改(System和System. web . services),仍然指向2.0.0.0版本。水晶报告引用4.0.0.0,所以这是冲突发生的地方。只需将光标放在解决方案资源管理器中的第一个System库上,向下移动列表并查找对2.0.0.0的任何引用,删除并重新添加新的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,然后将输出两次输送到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。

那么你可以在两者之间做出选择

说服库的所有者使用相同的版本 停止使用其中之一 在配置文件中添加绑定重定向以使用最新版本

如何在Windows中运行这些东西

如果你没有unix类型的shell,你需要在运行awkward和grep之前下载一个。试试下面的一种方法

CMDER + awk + dep.exe Gitbash + awk + dep.exe 天鹅座+德.exe

我也犯了同样的错误,无法用其他答案来计算。我发现我们可以“巩固”NuGet包。

右键单击解决方案 单击“管理Nuget包” 合并选项卡并更新到相同的版本。

有时候@AMissico的答案是不够的。在我的例子中,我在Output窗口中找不到错误,所以我决定创建一个日志文件并分析它,执行以下步骤:

将构建日志保存到一个文件…https://msdn.microsoft.com/en-us/library/ms171470.aspx msbuild MyProject的。proj /fl /flp:logfile=MyProjectOutput.log 查找文本:警告MS…或者具体的警告信息:(例如,第9293行)发现不同版本之间存在冲突…和冲突错误的完整细节将在此消息的上面(例如,第9277行)。

Visual Studio 2013

ASP。NET构建管理器通过按字母顺序浏览文件夹来构建网站,对于每个文件夹,它会找出它的依赖项并首先构建依赖项,然后再构建选定的文件夹。

在这种情况下,有问题的文件夹是~/Controls,在开始时被选择构建,出于未知的原因,它将一些控件构建为一个单独的程序集,而不是像其他控件一样在同一个程序集中(似乎与某些控件依赖于同一文件夹中的其他控件的事实有关)。

然后构建的下一个文件夹(~/File-Center/Control)依赖于根文件夹~/,根文件夹~/依赖于~/Controls,所以文件夹~/Controls再次被构建,只是这次分离到自己程序集的控件现在与其他控件连接到相同的程序集,分离的程序集仍然被引用。

因此此时至少有2个程序集具有相同的控件,构建失败。

虽然我们仍然不知道为什么会发生这种情况,我们能够通过将Controls文件夹名称更改为ZControls来解决它,这样它就不会在~/File-Center/Control之前构建,只在之后构建,这样它就应该被构建。