解决 MSB3247 - 发现同一依赖程序集的不同版本之间存在冲突
题
使用 msbuild 编译时,.NET 3.5 解决方案最终出现此警告。
有时 NDepend 可能会有所帮助,但在这种情况下,它没有提供任何进一步的详细信息。 像鲍勃一样 我最终不得不在 ILDASM 中打开每个程序集,直到找到引用旧版本依赖程序集的程序集。
我确实尝试使用 VS 2010 Beta 2 中的 MSBUILD(正如 Connect 文章指出的那样,这已在 CLR 的下一版本中修复),但也没有提供任何更多详细信息(可能在 Beta 2 后修复)
有更好的(更自动化的)方法吗?
解决方案
改变"MSBuild项目建立输出详细程度",以"详细"或以上。要做到这一点,按照这些步骤:
- 带来了选择对话(工具->的选择...).
- 在左边的树,选择 项目和解决方案 节点,然后选择 建立并运行.
- 注:如果这一点没有显示出来,确保该框底部的对话 显示全部设置 检查。
在工具/办法页显示,设置 MSBuild项目建立输出详细信息 一级的适当设置这取决于你的版本:
- 诊断 当上VS2012,VS2013或VS2015(消息在这些版本 说的 你应该使用"详细", 但是,这是简单的错误,则应使用"诊断")
- 详细 当你在VS2010
- 正常的 将满足在VS2008或老年人。
- 建造项目,并期待在输出窗口。
检查请参阅信息。的 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.
你没有打开每个会确定的版本引用的组件。
- 你可以检查的性质的每一个参考。
- 打开该项目的性质和检查版本的引用部分。
- 打开项目有一个文本编辑器。
- 使用。净反射器。
其他提示
麦克哈德洛具有贴称为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的输出。
某个时候@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 Studio2013年
我发现,(至少在Visual Studio 2010)需要的输出详细程度设置为至少详细到能够发现的问题。
这可能是我的问题是,以前是GAC参考参考,但已不再是我的机器重装后的情况。
为默认ASP.NET MVC 4测试生成该警告 见此处
在,任何投此警告可通过手动编辑消除 .csproj的文件,为您的项目。
修改........:参考包含= “System.Net.Http”
读取......:参考包含= “System.Net.Http,版本= 4.0.0.0”
我有同样的错误并不能解它与其他的答案。我发现,我们就可以"巩固"NuGet包。
- 右键解决方案
- 点击管理Nuget包
- 巩固标签和更新相同的版本。
使用一个依赖性的读者
使用 dep.exe 你可以列出所有的嵌套的依赖关系的整个文件夹。结合使用unix工具,如查询或awk,它可以帮你解决你的问题
找件正在引用多于一个版本
$ 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到
- 把父母和孩子在一个单列的(默认每个线都包含一个父母与孩子来表达这一事实,这取决于父的那个孩子)
- 然后做一个那种小组通过使用一个联合阵列
理解如何会得到了拉库
$ 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
在这个例子,该工具将告诉你这个系统。网。Http5.2.3来自你的依赖FooLib而版4.0.0来自BarLib.
然后你们之间的选择
- 令人信服的业主的库使用相同的版本
- 停止使用一种他们
- 增加结合在重定向您的配置文件使用最新版本
怎么跑这些事情在Windows
如果你没有一个unix类型的外壳将需要下载的一个前能够运行 awk
和 grep
.尝试一下
我也有这个问题,使用AMissico的建议过于发现问题(虽然必须设置详细级别,以详细。
这个问题实际上是相当简单的,虽然找到了罪魁祸首。
背景: 我升级我的项目从VS2008到VS2010。在VS2008目标框架是3.5,当我将其带入VS2010我它切换到4(完全)。我还升级某些第三方组件,包括Crystal报表。
原来,最系统的引用,其中在4.0.0.0版本指着但夫妇没有被自动更改(系统和System.Web.Services),并仍在寻找2.0.0.0。 Crystal Reports是引用4.0.0.0,因此,这是其中的矛盾是存在的。简单地把光标在第一系统库在Solution Explorer中,光标列表并寻找任何引用2.0.0.0,删除并重新添加新版本4.0.0.0做的伎俩。
奇怪,这是大部分引用了正确的更新,如果不是因为Crystal报表,我可能永远也注意到...
我根据以下内容提出了申请 迈克·哈德洛应用:AsmSpy.
我的应用程序是一个带有 GUI 的 WPF 应用程序,可以从我的家庭网络服务器下载: AsmSpyPlus.exe.
代码可在以下位置获取: GitHub
ASP.NET生成管理器由通过文件夹会按字母顺序构建网站,并为每个文件夹它计算出它的依赖关系和第一,然后构建依赖所选择的文件夹中。
在这种情况下有问题的文件夹,其为〜/控制,被选择在开始时建立,从又一个未知的原因,它建立了一些控制那里的作为单独的组件,而不是相同的组件,其它控制内(似乎被连接到一个事实,即某些控件依赖于在相同的文件夹以外的控制)。
然后这是建立下一个文件夹(〜/文件-中心/控制)是依赖于根文件夹〜/其取决于〜/控制,所以该文件夹〜/控制被再次建立只是这次控制将其分离到他们自己的组件现在被接合到相同的组件,与分离的组件仍正在引用其他控件。
所以在这一点2组件(至少)具有相同的控制和生成失败。
虽然我们仍然不知道为什么会这样,我们可以通过改变控制文件夹名称ZControls解决它,这样它不是〜/文件中心/控制前,后仅建成这样它是建立,它应。
<强>快速修复强>
在解决方案右键 - >管理的NuGet包解决方案 - >在合并您可以看到,如果有安装了不同版本的同一个包的。卸载不同版本和安装最新的一个。
有时AutoGenerateBindingRedirects
是不够的(即使使用 GenerateBindingRedirectsOutputType
)。在搜索所有的There was a conflict
条目并通过一个手动进行一个固定可能是乏味,所以我写一小块代码解析日志输出并生成他们为你(转储到stdout
):
// Paste all "there was a conflict" lines from the msbuild diagnostics log to the file below
const string conflictFile = @"C:\AssemblyConflicts.txt";
var sb = new StringBuilder();
var conflictLines = await File.ReadAllLinesAsync(conflictFile);
foreach (var line in conflictLines.Where(l => !String.IsNullOrWhiteSpace(l)))
{
Console.WriteLine("Processing line: {0}", line);
var lineComponents = line.Split('"');
if (lineComponents.Length < 2)
throw new FormatException("Unexpected conflict line component count");
var assemblySegment = lineComponents[1];
Console.WriteLine("Processing assembly segment: {0}", assemblySegment);
var assemblyComponents = assemblySegment
.Split(",")
.Select(kv => kv.Trim())
.Select(kv => kv.Split("=")
.Last())
.ToArray();
if (assemblyComponents.Length != 4)
throw new FormatException("Unexpected conflict segment component count");
var assembly = assemblyComponents[0];
var version = assemblyComponents[1];
var culture = assemblyComponents[2];
var publicKeyToken = assemblyComponents[3];
Console.WriteLine("Generating assebmly redirect for Assembly={0}, Version={1}, Culture={2}, PublicKeyToken={3}", assembly, version, culture, publicKeyToken);
sb.AppendLine($"<dependentAssembly><assemblyIdentity name=\"{assembly}\" publicKeyToken=\"{publicKeyToken}\" culture=\"{culture}\" /><bindingRedirect oldVersion=\"0.0.0.0-{version}\" newVersion=\"{version}\" /></dependentAssembly>");
}
Console.WriteLine("Generated assembly redirects:");
Console.WriteLine(sb);
提示:使用 MSBuild的二进制和结构化日志查看器和只有生成绑定重定向为项目中发射的冲突警告(即,只有过去那些there was a conflict
线为上述代码[AssemblyConflicts.txt
]输入的文本文件)。
一个简单的方式,而没有一个考虑到(内部)相关性:
- 打开"方案Explorer".
- 点击"显示所有文件"
- 扩大"引用"
- 你会看到一个(或多个)的参考(s)略有不同的标比其他人。通常,这是与黄色的框建议采注意到这一点。只要删除它。
- 添加参照背和编写代码。
- 这就是全部。
在我的情况下,有一个问题与MySQL参考。不知怎的,我可以列出三个版本的下列所有可供参考。我跟踪过程1-6以上,它为我工作。
Visual Studio中的Mac社区此外:
如 AMissico的回答需要改变日志级别,并且既不ASMSpy也不ASMSpyPlus可作为一个跨平台解决方案,这里是一个短另外的Visual Studio为Mac:
https://docs.microsoft.com/en -us / VisualStudio的/ MAC /编译和建筑物
这是在 Visual Studio的社区→首选项...→项目→生成日志→冗长
如果您有ReSharper的,解除您解决所有未使用的参考。