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


320

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

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

"Found conflicts between different versions of the same dependent assembly".

该警告的确切含义是什么,并且可能有可能排除此警告(例如在源代码文件中使用#pragma disable)?


Answers:


410

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

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

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

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

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

  • 您可以使用一种实用程序,例如https://gist.github.com/1553265上的实用程序。
  • 另一个简单的方法是设置“生成”输出详细程度(“工具”,“选项”,“项目和解决方案”,“生成和运行”,“ MSBuild”项目生成“输出详细程度”,“详细”),并在生成之后,在输出窗口中搜索警告,并查看其上方的文本。 。 (向在此答案的评论中建议这一点的鲍洛伊亚的提示)

9
只是一种无需工具即可快速找到它的方法-如果您确实添加了绑定重定向(作为选项2),它将在其中显示所涉及的引用-如果需要,则可以使用其他方法之一处理它,并从配置文件中删除绑定重定向。
Brisbe 2011年

222
查找“违规参考”的最简单方法是设置“生成”输出详细程度(“工具”,“选项”,“项目和解决方案”,“生成和运行”,“ MSBuild”项目生成“输出详细程度”,“详细”),并在生成之后搜索输出窗口警告。看到上面的文字。
pauloya 2011年

7
通过双击警告(步骤2)来绑定重定向不会删除我的警告。我看到我怀疑是由程序集添加的app.config是引起问题的原因,但是在清理/重建之后,警告仍然存在。另外还尝试了第3步,没有运气。有任何想法吗?
angularsen 2012年

9
如果它们不是您自己项目的引用怎么办?例如,我引用了一个项目,它依赖于Newtonsoft.Json,版本= 6.0.0.0,而我引用了另一个项目,它依赖于Newtonsoft.Json,版本= 4.5.0.0
Edward Ned Harvey

3
@ brian-low,我是否可以建议将Build输出详细程度设置(如@pauloya的注释中所建议)作为链接实用程序的选项添加到您的答案中?(免责声明,我实际上是试图编辑答案来做到这一点,但在审查时被拒绝了:))
Rick Riensche

44

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

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

我解决的方法是将“本地复制”设置为False,以供装配项目中的引用使用。仅对需要组装才能运行成品的可执行文件/ Web应用程序执行此操作。

希望有道理!


31

我想发布他们在上面的评论中提供的pauloya解决方案。我相信这是找到违规参考的最佳解决方案。

查找“违规参考”的最简单方法是设置“生成”输出详细程度(“工具”,“选项”,“项目和解决方案”,“生成和运行”,“ 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之间存在冲突。


3
但是,既然我掌握了这些信息,该如何消除该错误?我可以看到冲突所在,但找不到项目引用冲突版本的位置
Bassie

@Bassie,您好,第一件事是检查您的nuget软件包文件,并确定您是否需要将所有文件更新为相同版本的软件包。您可以通过运行与update-package [your package name] -version 6.0.0 -reinstall此处我的答案类似的命令来做到这一点stackoverflow.com/questions/22685530/…–
user1477388

@Bassie,您可以执行警告提示的操作,并将绑定重定向添加到app.config文件中!(如果没有选择更新,那就是。)
BrainSlugs83

@Bassie看到我的答案,在这里向您展示如何获取导致不匹配问题的不同程序集/.dll。
newprint '19

22

我的一个项目也遇到了同样的问题,但是以上都不是解决警告的方法。我检查了详细的构建日志文件,使用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
这里同样的问题。但是,我没有机会将引用更新为较新的版本。我尝试使用App.config:虽然适用于该应用程序,但Visual Studio 2010似乎在构建过程中将其忽略。
Thomas Weller 2012年

1
哇,我遇到这些问题已经两个月了,无法查明并解决它。由于某种原因,它只会在调试期间崩溃,并且在某些情况下,会在bin文件夹中用真实的.dll手动替换麻烦的.dll。调试是一个真正的痛苦。当我读到您的回答时,我意识到这正是我要发生的事情,我在5分钟内解决了问题:)
Dennis Puzak 2014年

19

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


谢谢你的提示。这次对我没有帮助,但是很高兴知道它在那里。
BrainSlugs83

8

我刚收到此警告消息并清理了解决方案,然后重新编译(“构建”->“清理解决方案”),它就消失了。


9
但是直到您重新构建解决方案
路加福音

这救了我!从昨天开始,我一直在尝试其他解决方案,但这解决了我的问题。包括上面的评论^。谢谢!
vnpnlz

6

我遇到了同样的问题,并通过更改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>

这是我的解决方案。我有一个绑定重定向到较高版本,并且仅在移至较低版本后才起作用。
mrwaim 2014年

1
为什么?我真奇怪 我不使用EF,但我想我们一直想升级到最新版本?
霍隆2015年

1
@HoàngLong,因为您所引用的版本是较旧的版本,但是您要包含的版本是较新的版本。
BrainSlugs83

3

如果您使用Nuget来管理依赖项,我还有另一种方法。我发现有时VS和Nuget不匹配,并且Nuget无法识别您的项目不同步。packages.config会说一件事,但是“参考-属性”中显示的路径会指出其他内容。

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

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

  2. 选择左窗格中的'已安装软件包'选项卡记录已安装的软件包如果您有很多的话,可能需要先将您的packages.config复制到桌面上,因此可以与Google进行交叉检查以查看已安装了哪些Nuget pkgs。

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

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

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

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

您可能要从较低的项目开始,然后逐步发展到较高的项目,然后逐步进行每个项目的重建。

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


2

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

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

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


2

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

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

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

这解决了我的问题。希望它对您也有帮助。最好的祝福。


1

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


1

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

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

  2. 单击右上角的齿轮

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

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

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

十分简单


1

我只是花了一些时间调试相同的问题。请注意,该问题可能不在不同的项目之间,而是实际上在一个项目中的多个引用之间,这些引用依赖于同一dll /程序集的不同版本。在我的情况下,问题是参考FastMember.dll版本不匹配,该版本来自单个项目中的两个不同的NuGet软件包。当给我一个项目时,它不会编译,因为缺少NuGet软件包,而VS拒绝还原丢失的软件包。通过NuGet菜单,我将所有NuGets手动更新为最新版本,即出现警告时。

在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来自ClosedXMLNuGet,取决于FastMember.dll 1.3.0.0。最重要的是FastMember,该项目中还包含Nuget,并且具有 FastMember.dll 1.5.0.0。不匹配!

我已卸载ClosedXMLFastMemberNuGets,因为我具有绑定重定向并仅安装了最新版本的ClosedXML那已解决了该问题!


0

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


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

就我而言,MySQL参考存在问题。不知何故,我可以在所有可用参考文献的列表下列出它的三个版本。适用于.net 2.0,.net 4.0和.net 4.5。我按照上面的过程1到6进行了工作,对我来说很有效。


0

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


0

在编辑.resx文件时,Mac Visual Studio上似乎存在问题。我真的不知道发生了什么,但是我在Mac上编辑了一些.resx文件后就遇到了这个问题。我在Windows上打开了项目,打开了文件,好像它们没有被编辑一样。因此,我对其进行了编辑,保存,然后所有内容在Mac上也再次开始工作。



0

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

当您发现什么冲突时,也许您将能够解决这些冲突。如果有冲突的引用来自其他软件包,那么您要么不走运,要么需要使用源。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.