警告:发现同一依赖程序集的不同版本之间存在冲突

Warning: Found conflicts between different versions of the same dependent assembly

提问人:ollifant 提问时间:8/20/2008 最后编辑:TylerHollifant 更新时间:10/25/2022 访问量:216731

问:

我目前正在开发一个 .NET 应用程序,它由 20 个项目组成。其中一些项目是使用 .NET 3.5 编译的,其他一些项目仍然是 .NET 2.0 项目(到目前为止没有问题)。

问题是,如果我包含外部组件,我总是收到以下警告:

发现同一依赖程序集的不同版本之间存在冲突。

此警告究竟是什么意思,是否有可能排除此警告(例如在源代码文件中使用 #pragma disable)?

.NET 警告

评论


答:

46赞 Matt Hamilton 8/20/2008 #1

基本上,当您引用的程序集将“Copy Local”设置为“True”时,就会发生这种情况,这意味着 DLL 的副本与您的 exe 一起放置在 bin 文件夹中。

由于 Visual Studio 也会复制引用的程序集的所有依赖项,因此最终可能会引用同一程序集的两个不同版本。如果您的项目位于单独的解决方案中,则更有可能发生这种情况,因此可以单独编译。

我解决它的方法是将程序集项目中的引用的 Copy Local 设置为 False。仅对需要程序集才能运行成品的可执行文件/Web 应用程序执行此操作。

希望这是有道理的!

2赞 Jon Limjap 8/20/2008 #2

这实际上取决于您的外部组件。当您在 .NET 应用程序中引用外部组件时,它会生成一个 GUID 来标识该组件。当其中一个项目引用的外部组件与另一个组件中的另一个此类组件具有相同的名称和版本时,会发生此错误。

当您使用“浏览”查找引用并添加错误的程序集版本,或者代码存储库中的组件版本与本地计算机中安装的组件版本不同时,有时会发生这种情况。

请尝试查找哪些项目存在这些冲突,从引用列表中删除组件,然后再次添加它们,确保指向同一文件。

441赞 Brian Low 1/26/2010 #3

此警告意味着两个项目引用相同的程序集(例如),但两个项目需要不同的版本。您有以下几种选择:System.Windows.Forms

  1. 重新编译所有项目以使用相同的版本(例如,将所有项目移至 .Net 3.5)。这是首选选项,因为所有代码都使用编译它们的依赖项版本运行。

  2. 添加绑定重定向。这将禁止显示警告。但是,.Net 2.0 项目将(在运行时)绑定到依赖程序集的 .Net 3.5 版本,例如 .可以通过双击 Visual Studio 中的错误来快速添加绑定重定向。System.Windows.Forms

  3. 用。我不确定这是否会抑制警告。与上面的选项 2 一样,这意味着所有项目都将使用 System.Windows.Forms 的 .Net 3.5 版本。CopyLocal=true

以下是识别违规引用的几种方法:

  • 您可以使用实用程序,例如在 https://gist.github.com/1553265 上找到的实用程序
  • 另一种简单的方法是设置 Build 输出详细程度(“工具”、“选项”、“项目和解决方案”、“生成”和 运行,MSBuild 项目生成输出详细程度,详细)和之后 生成,在输出窗口中搜索警告,然后查看 文字就在它上面。(向 pauloya 致敬,他在 对此答案的评论)。

评论

9赞 Brisbe 6/8/2011
只是为了在没有实用程序的情况下快速找到它 - 如果您确实添加了绑定重定向(作为选项 2),它将在那里显示所涉及的引用 - 如果需要,您可以使用其他方法之一来处理它,并从配置文件中删除绑定重定向。
239赞 pauloya 10/12/2011
查找“违规引用”的最简单方法是设置“生成输出详细程度”(“工具”、“选项”、“项目和解决方案”、“生成并运行”、“MSBuild”项目生成输出详细程度、“详细”),并在生成后在输出窗口中搜索警告。请参阅其上方的文本。
10赞 angularsen 5/20/2012
通过双击警告(第 2 步)绑定重定向,不要删除我的警告。我看到app.config与我怀疑是原因的程序集一起添加,但是在清理/重建后警告仍然存在。另外还尝试了第 3 步,没有运气。有什么想法吗?
13赞 Edward Ned Harvey 10/11/2014
如果它们不是你自己项目的参考,该怎么办?例如,我引用了一个依赖于 Newtonsoft.Json 的项目,Version=6.0.0.0,我引用了另一个依赖于 Newtonsoft.Json 的项目,Version=4.5.0.0
3赞 Rick Riensche 1/6/2018
@brian低,我是否可以建议将构建输出详细程度设置(如@pauloya在评论中建议的那样)作为链接实用程序旁边的答案中的一个选项?(免责声明,我实际上试图编辑答案来做到这一点,但在审查:)时被拒绝了)
9赞 MoMo 1/17/2012 #4

我只是收到此警告消息并清理了解决方案并重新编译(Build -> Clean Solution),然后它就消失了。

评论

11赞 Luke 8/24/2014
不过,只有在重新生成解决方案之前
0赞 MuntingInsekto 2/12/2016
这救了我!从昨天开始,我一直在尝试其他解决方案,但这个解决方案解决了我的问题。包括上面的评论^。谢谢!
23赞 Gorgsenegger 11/10/2012 #5

我的一个项目也遇到了同样的问题,但是,以上都无助于解决警告。我检查了详细的构建日志文件,我使用 AsmSpy 来验证我是否为受影响的解决方案中的每个项目使用了正确的版本,我仔细检查了每个项目文件中的实际条目 - 没有任何帮助。

最终发现,问题是我在一个项目中的一个引用的嵌套依赖关系。此引用 (A) 又需要 (B) 的不同版本,该版本直接从我的解决方案中的所有其他项目引用。更新引用项目中的引用解决了它。

Solution A
+--Project A
   +--Reference A (version 1.1.0.0)
   +--Reference B
+--Project B
   +--Reference A (version 1.1.0.0)
   +--Reference B
   +--Reference C
+--Project C
   +--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)

Solution B
+--Project A
   +--Reference A (version 1.1.1.0)

我希望以上内容能说明我的意思,花了我几个小时才知道,所以希望其他人也能受益。

评论

1赞 Thomas Weller 12/19/2012
同样的问题在这里。但是,我没有机会将引用更新到较新版本。我尝试使用App.config:虽然它适用于应用程序,但Visual Studio 2010似乎在构建过程中忽略了它。
1赞 Dennis Puzak 1/14/2014
哇,我已经有这些问题两个月了,无法查明并解决它。出于某种原因,它只会在调试期间崩溃,在某些情况下,它会手动将麻烦的.dll替换为 bin 文件夹中的真实。调试是一件非常痛苦的事情。当我读到你的回答时,我意识到这正是发生在我身上的事情,我在大约 5 分钟内修复了它:)
0赞 Igor Gorjanc 2/12/2014 #6

这也发生在我身上。一个 dll 被引用了两次:一次是直接引用(在引用中),一次是间接引用(由另一个引用的项目引用)。 我删除了直接引用,清理并重建了解决方案。问题已修复。

3赞 Bill 4/9/2014 #7

如果您使用 Nuget 来管理您的依赖项,我还有另一种方法可以做到这一点。我发现有时 VS 和 Nuget 不匹配,Nuget 无法识别您的项目不同步。packages.config 将表示一件事,但“引用 - 属性”中显示的路径将指示其他内容。

如果您愿意更新依赖项,请执行以下操作:

  1. 在“解决方案资源管理器”中,右键单击“项目”,然后单击“管理” Nuget 包

  2. 在左窗格中选择“已安装的软件包”选项卡 记录已安装 packages 你可能想把你的 packages.config 复制到你的 如果你有很多,请先桌面,这样你就可以交叉检查它 Google 查看安装了哪些 Nuget pkgs

  3. 卸载软件包。没关系,我们将立即将它们添加回来。

  4. 立即安装您需要的软件包。Nuget 不仅会为你提供最新版本,还会更改你的引用,并为你添加绑定重定向。

  5. 对所有项目执行此操作。

  6. 在解决方案级别,执行“清理并重新生成”。

您可能希望从较低的项目开始,然后逐步发展到较高级别的项目,并在进行过程中重新构建每个项目。

如果不想更新依赖项,则可以使用包管理器控制台,并使用语法 Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]

0赞 Sukhi 6/15/2014 #8
  1. 打开“解决方案资源管理器”。
  2. 点击“显示所有文件”
  3. 展开“参考资料”
  4. 您将看到一个(或多个)引用的图标与其他引用略有不同。通常,它带有黄色框,建议您记下它。只需将其删除即可。
  5. 重新添加引用并编译代码。
  6. 就这样。

就我而言,MySQL引用存在问题。不知何故,我可以在所有可用参考文献列表下列出它的三个版本;适用于 .NET 2.0、.NET 4.0 和 .NET 4.5。我遵循了上面的过程 1 到 6,它对我有用。

6赞 Phil50 7/13/2014 #9

我遇到了同样的问题,我通过更改web.config中的以下内容解决了这个问题。

它发生在我身上,因为我正在使用 Newtonsoft.Json 4.0 运行应用程序

从:

<dependentAssembly>
  <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>

自:

<dependentAssembly>
  <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>

评论

0赞 mrwaim 10/27/2014
这是我的解决方案。我有一个绑定重定向到更高版本,它只有在我移动到较低版本后才有效。
1赞 Hoàng Long 12/17/2015
为什么?对我来说太奇怪了。我不使用 EF,但我认为我们总是想移动到最后一个版本?
1赞 BrainSlugs83 10/7/2016
@HoàngLong,因为您引用的版本是旧版本,但您包含的版本是较新的版本。
1赞 Tristan Lewis 11/20/2014 #10

也有这个问题 - 在我的情况下,这是由于将许多引用上的“特定版本”属性设置为 true 引起的。在这些引用上将其更改为 false 解决了该问题。

35赞 user1477388 11/10/2015 #11

我想在上面的评论中发布他们提供的 pauloya 解决方案。我相信这是查找有问题的参考文献的最佳解决方案。

查找什么是“违规引用”的最简单方法是 set 生成输出详细程度(“工具”、“选项”、“项目”和“解决方案”、” 生成并运行,MSBuild 项目生成输出详细程度,详细)和 生成后,在输出窗口中搜索警告。查看正文 就在它上面。

例如,当您在输出面板中搜索“冲突”时,您可能会发现如下内容:

3>  There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3>      "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.

如您所见,EF 版本 5 和 6 之间存在冲突。

评论

5赞 Bassie 11/11/2016
但是现在我有了这些信息,如何删除错误?我可以看到冲突是什么,但我找不到项目引用冲突版本的位置
0赞 user1477388 11/11/2016
嗨,@Bassie,首先要做的是检查 nuget 包文件并确定是否需要将所有文件更新为相同版本的包。您可以通过运行类似于我在这里的回答的命令来做到这一点 stackoverflow.com/questions/22685530/...update-package [your package name] -version 6.0.0 -reinstall
0赞 BrainSlugs83 7/1/2017
@Bassie,您可以按照警告建议执行操作,并将绑定重定向添加到 app.config 文件!(如果更新不是一个选项,那就是。
0赞 newprint 6/13/2019
@Bassie看看我的答案,我向你展示了如何获取导致不匹配问题的不同程序集/.dll。
29赞 Tiago Gouvêa 10/1/2016 #12

在 Visual Studio 上,如果右键单击解决方案管理 nuget 包,则会出现一个“合并”选项卡,该选项卡将所有包设置为相同的版本。

1赞 Neelam Prajapati 4/18/2017 #13

=>检查是否将部分安装某些应用程序实例。

=>首先从卸载应用程序中卸载该实例。

=>然后,清理,重建,并尝试部署。

这解决了我的问题,希望它也能帮助你。 此致敬意。

0赞 Telwa Gangnam 10/9/2017 #14

要考虑和检查的另一件事是,确保您没有运行任何使用该 bin 文件夹的服务。如果有停止服务并重新生成解决方案

0赞 Dpedrinha 3/13/2018 #15

编辑 .resx 文件时,Mac Visual Studio 上似乎存在问题。 我真的不知道发生了什么,但是当我在Mac上编辑一些.resx文件时,我就遇到了这个问题。 我在 Windows 上打开了这个项目,打开了文件,它们就好像没有被编辑过一样。 所以我编辑了它们,保存了它们,一切也开始在 Mac 上工作。

0赞 Jacek Plesnar 4/5/2019 #16

当我的项目引用了 NETStandardLibrary 并且为 netcore 发布了其中一个引用的程序集时,我遇到了这样的问题。刚刚将其发布为netstandard,问题就消失了

1赞 tkefauver 6/1/2019 #17

如果使用 NuGet,我所要做的就是:

  1. 右键单击“项目”,然后单击“管理 NuGet 包”。

  2. 单击右上角的齿轮

  3. 单击“包源”上方的“NuGet 包管理器”中的“常规”选项卡

  4. 检查绑定重定向中的“跳过应用绑定重定向”

  5. 清理并重建,警告就消失了

简单易行

2赞 newprint 6/13/2019 #18

我只是花了一些时间调试同样的问题。请注意,该问题可能不是在不同的项目之间,而是在一个项目中依赖于同一 dll/程序集的不同版本的多个引用之间。就我而言,问题是来自单个项目中两个不同 NuGet 包的引用版本不匹配。当我得到一个项目时,它不会编译,因为缺少 NuGet 包并且 VS 拒绝恢复丢失的包。通过 NuGet 菜单,我手动将所有 NuGet 更新到最新版本,也就是出现警告的时候。FastMember.dll

在 Visual Studio 中,查找窗口中的行。以下是我得到的部分输出:Tools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics.There was a conflict betweenOutput

1>  There was a conflict between "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null". (TaskId:19)
1>      "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" was chosen because it was primary and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" was not. (TaskId:19)
1>      References which depend on "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" [C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll]. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll". (TaskId:19)
1>              FastMember, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)
1>      References which depend on "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" []. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll". (TaskId:19)
1>              ClosedXML, Version=0.94.2.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)

请注意,那Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll"

ClosedXML.dll来自 NuGet,它取决于 .最重要的是,项目中还有 Nuget,它有 .失 配!ClosedXMLFastMember.dll 1.3.0.0FastMemberFastMember.dll 1.5.0.0

我已经卸载了 & NuGets,因为我有绑定重定向并安装了最新版本的 这解决了问题!ClosedXMLFastMemberClosedXML

0赞 Harry 9/27/2019 #19

下面是解决方案,.NET Core 3.0 样式:https://github.com/HTD/ref-check

当你找到什么冲突时,也许你能够解决冲突。 如果冲突的引用来自其他包,则您要么运气不好,要么需要使用源。

就我而言,冲突的包通常是我自己的,所以我可以修复依赖项问题并重新发布它们。

0赞 Tim Makins 10/3/2021 #20

我有同样的问题。在项目的“obj”文件夹中,我将文件夹“Debug”重命名为“Debug_OLD”并重新构建。一个新的“调试”文件夹是自动构建的,问题就消失了。

0赞 Kluge 10/25/2022 #21

在尝试分析详细的生成日志几个小时后,我发现我的解决方案中的几个项目面向不同的 .Net 版本。我将它们全部更改为 .Net 4.7.2 并重建了解决方案,错误得到了解决。