ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

就我而言,我只需要确保解决方案中的所有项目都运行相同版本的 nuget 包(可以简单地将所有项目更新到最新版本)。

C
Community

将“MSBuild 项目构建输出详细程度”更改为“详细”或更高。为此,请按照下列步骤操作:

调出选项对话框(工具 -> 选项...)。在左侧树中,选择 Projects and Solutions 节点,然后选择 Build and Run。注意:如果此节点未显示,请确保选中对话框底部的复选框显示所有设置。在出现的工具/选项页面中,根据您的版本将 MSBuild 项目构建输出详细级别设置为适当的设置:在 VS2012、VS2013 或 VS2015 上时的诊断(这些版本中的消息说您应该使用“详细”,但这是完全错误的,你应该使用“诊断”)当你在 VS2010 上时详细说明 在 VS2008 或更早版本中就足够了。构建项目并查看输出窗口。

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

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

您可以检查每个参考的属性。

打开项目属性并检查参考部分的版本。

使用文本编辑器打开项目。

使用 .Net 反射器。


您的解决方案对我来说看起来不错,但是我认为使用“参考”部分查看版本号并不总是有用的。我经常看到 VS 对我“撒谎”它正在使用哪个版本,而 .csproj 文件中实际上提到了哪个版本。
@David Gardiner - 在使用 C# 项目时,我同意您的“撒谎”声明。根据我的经验,C# 项目可能会对引用的版本和编译/链接的实际版本感到困惑。发生这种情况时,我清理解决方案,手动删除 bin 和 obj 文件夹,然后删除 %APPDATA% 中的临时项目程序集。重建解决方案通常可以解决问题。 (VB 很少遇到这个特定问题。)
win 告诉人们实际使用输出窗口。构建不仅仅是 F5 + 错误列表窗口。
正如 ErikHeemskerk 在他的回答中提到的,在 Visual Studio 2010 中,您需要将输出详细程度设置为详细才能查看 ResolveAssemblyReferences 的输出。
提示:要在详细构建输出中找到确切的位置,请将文本复制到文本编辑器中,搜索“发现同一依赖程序集的不同版本之间的冲突。”。
K
Kirill Kobelev

Mike Hadlow 的 posted a little console app called 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

与依赖 MSBuild 输出相比,这是了解 MSB3247 警告底部的更快方法。


AsmSpy 很棒,您只需要记住您正在寻找对具有不匹配版本的第三方 DLL 的引用。通常,对标准库的引用中的不匹配版本不会导致这些警告(您会经常看到它们)。
这是一个很棒的小工具,它帮助我立即解决了我的问题。然而,就我而言,它并不完全是第三方 DLL,而是对 System.Management.Automation.dll 的引用,它对 mscorlib.dll 有不同的引用。
该工具很好,但是,它并非在所有情况下都有效。至少对于 .NET 4.5 项目,它没有为我显示冲突引用版本。 + msbuild 输出用路径和所有名称命名有问题的 DLL。
谢谢你们的客气话:)
你刚刚为我节省了几个小时的工作时间!它确实有助于阅读详细的输出,但是一旦我这样做了,就很容易再次使用您的工具进行验证。
J
Jaider

有时@AMissico 的回答是不够的。就我而言,我在“输出”窗口中找不到错误,因此我决定创建一个日志文件并进行分析,方法是执行以下步骤:

将构建日志保存到文件... https://msdn.microsoft.com/en-us/library/ms171470.aspx msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed 查找文本:警告 MS... 或特定警告信息:(例如第 9293 行)发现不同版本之间的冲突...并且冲突错误的完整详细信息将在此消息的上方(例如第 9277 行)之间存在冲突。 ..

视觉工作室 2013


E
ErikHeemskerk

我发现(至少在 Visual Studio 2010 中)您需要将输出详细程度至少设置为“详细”才能发现问题。

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


转到工具-> 选项-> 项目和解决方案-> 构建和运行以设置输出详细程度。
C
Carol

我有同样的错误,无法用其他答案弄清楚。我发现我们可以“整合”NuGet 包。

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


C
Community

为默认 ASP.NET MVC 4 beta see here 生成此警告

在中,可以通过手动编辑项目的 .csproj 文件来消除此警告的任何强制转换。修改............:参考 Include="System.Net.Http" 改为阅读......:参考 Include="System.Net.Http, Version=4.0.0.0"


我遵循了这个,错误消失了。仍然不知道如何或为什么,我用 VS2010 开始了一个 MVC 4 项目,然后在 VS2012 上迁移。但是,添加版本属性,使错误消失。谢谢
C
Community

使用依赖阅读器

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

将父项和子项放在一个列中(默认情况下,每行包含一个父项和一个子项,以表示该父项依赖于该子项这一事实)

然后使用关联数组进行一种“分组”

了解这个组件是如何被拉进你的垃圾箱的

$ 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,则需要先下载一个,然后才能运行 awkgrep。尝试以下方法之一

cmder + awk + dep.exe

gitbash + awk + dep.exe

cygwin + dep.exe


H
Hamiora

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

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

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

事实证明,大多数系统引用都指向版本 4.0.0.0,但有几个没有自动更改(System 和 System.Web.Services)并且仍在查看 2.0.0.0。 Crystal 报表引用 4.0.0.0,因此这是发生冲突的地方。只需将光标放在解决方案资源管理器中的第一个系统库上,向下光标移动列表并查找对 2.0.0.0 的任何引用,删除并重新添加较新的 4.0.0.0 版本就可以了。

奇怪的是,大多数参考资料都已正确更新,如果不是水晶报表,我可能永远不会注意到...


G
GorvGoyl

快速解决:

右键单击解决方案 -> 管理解决方案的 NuGet 包 -> 在合并下,您可以查看是否安装了同一包的不同版本。卸载不同版本并安装最新版本。


这应该是最佳答案。为整个解决方案整合 NuSet 使您可以查看问题所在并毫无问题地更新它们
这是这个问题最简单的答案,感谢您的帮助。
B
BartoszKP

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

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

代码位于:GitHub

https://i.stack.imgur.com/K89Zp.png


B
Bhargav Rao

here 所述,您需要删除未使用的引用,警告就会消失。


M
Mike Yinger

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

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

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

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

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


O
Ohad Schneider

有时 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 Binary and Structured Log Viewer 并且只为发出警告的项目中的冲突生成绑定重定向(即,仅将那些 there was a conflict 行传递到上面代码 [AssemblyConflicts.txt] 的输入文本文件)。


D
David Gardiner

一种最简单的方法,无需考虑(内部)依赖关系:

打开“解决方案资源管理器”。单击“显示所有文件” 展开“参考” 您将看到一个(或多个)参考,其图标与其他参考略有不同。通常,它带有黄色框,建议您记下它。只需将其删除。添加引用并编译您的代码。就这样。

就我而言,MySQL 参考存在问题。不知何故,我可以在所有可用参考列表下列出它的三个版本。我遵循了上面的过程 1 到 6,它对我有用。


C
Community

Visual Studio for Mac 社区补充:

由于 AMissico's answer 需要更改日志级别,并且 ASMSpy 和 ASMSpyPlus 都不能用作跨平台解决方案,因此下面是 Visual Studio for Mac 的简短补充:

https://docs.microsoft.com/en-us/visualstudio/mac/compiling-and-building

它在 Visual Studio Community → Preferences... → Projects → Build Log → verbosity


P
Pascal Carmoni

如果您有 reshaper,请删除解决方案中所有未使用的参考。