.net - 警告:在相同的相关程序集的不同版本之间发现冲突


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

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

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

这个警告究竟意味着什么,有可能排除这个警告(就像在源代码文件中使用#pragma disable一样)?


Answers


此警告意味着两个项目引用相同的程序集(例如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版本。

这是一个实用工具,以确定违规参考(S):

https://gist.github.com/1553265




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

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

我已经得到的方式是将复制本地设置为假装配项目中的引用。 只适用于需要运行成品的程序集的可执行程序/ Web应用程序。

希望是有道理的!




我想发表他们在上面评论中提供的保罗亚的解决方案。 我相信这是找到违规引用的最佳解决方案。

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




我和我的一个项目有同样的问题,但是,以上都没有帮助解决这个警告。 我检查了详细的构建日志文件,我使用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)

我希望上面显示的是我的意思,花了我几个小时的时间来发现,所以希望别人也会受益。




我只是有这个警告消息,并清理解决方案,并重新编译(建设 - >清洁解决方案),它走了。




我有同样的问题,我通过在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>



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




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

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

请尝试找到哪些项目有这些冲突,从参考列表中删除组件,然后再次添加它们,确保您指向相同的文件。




如果你使用Nuget来管理你的依赖关系,我有另一种方法来做到这一点。 我发现有时VS和Nuget不匹配,Nuget无法识别你的项目不同步。 packages.config会说一件事,但是参考文献 - 属性中显示的路径会指出其他的东西。

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

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

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

  3. 卸载你的软件包。 好的,我们马上把它们加进去。

  4. 立即安装你需要的软件包。 Nuget将会做的不仅是让你获得最新版本,而且会改变你的引用,并为你添加绑定重定向。

  5. 为所有的项目做这个。

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

您可能希望从较低的项目开始,到更高层次的项目,并随时重建每个项目。

如果你不想更新你的依赖关系,那么你可以使用包管理器控制台,并使用Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]




也有这个问题 - 在我的情况下,它是由一些引用设置为true的“特定版本”属性造成的。 在这些引用上将其更改为false可以解决问题。




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

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

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

这解决了我的问题,它也可以帮助你。 最好的祝福。




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




  1. 打开“解决方案浏览器”。
  2. 点击“显示所有文件”
  3. 展开“参考”
  4. 您会看到一个(或多个)参考图标,其图标略有不同。 通常情况下,黄色的方块表示你要记下它。 只要删除它。
  5. 添加参考返回并编译您的代码。
  6. 就这样。

在我的情况下,MySQL参考有一个问题。 不知何故,我可以列出所有可用参考列表下的三个版本; 为.net 2.0,.net 4.0和.net 4.5。 我遵循上面的过程1到6,它为我工作。




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