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

时间:2008-08-20 12:01:00

标签: .net warnings

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

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

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

这个警告到底是什么意思,是否有可能排除此警告(比如在源代码文件中使用#pragma disable)?

19 个答案:

答案 0 :(得分:392)

此警告表示两个项目引用同一个程序集(例如System.Windows.Forms),但这两个项目需要不同的版本。您有几个选择:

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

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

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

  4. 以下是识别违规参考的几种方法:

    • 你可以使用一个实用程序,例如在 https://gist.github.com/1553265
    • 另一个简单的方法是设置Build 输出详细程度(工具,选项,项目和解决方案,构建和 运行,MSBuild项目构建输出详细程度,详细)和之后 构建,在输出窗口中搜索警告,然后查看 正上方的文字。 (帽子提示pauloya谁提出了这个建议 对此答案的评论)

答案 1 :(得分:42)

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

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

我得到的方法是将装配项目中的引用设置为Copy Local to False。只对需要运行成品的程序集的可执行文件/ Web应用程序执行此操作。

希望有意义!

答案 2 :(得分:30)

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

  

查找"违规参考资料的最简单方法"是的   设置构建输出详细程度(工具,选项,项目和解决方案,   构建和运行,MSBuild项目构建输出详细程度,详细)和   构建完成后,在输出窗口中搜索警告。见文   在它上面。

例如,当您在输出面板中搜索" conflict"你可能会发现这样的事情:

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 :(得分:21)

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

我希望以上显示我的意思,花了几个小时才发现,所以希望其他人也会受益。

答案 4 :(得分:13)

在Visual Studio中,如果右键单击解决方案管理nuget包,则需要“合并”标签,将所有包设置为相同的版本。

答案 5 :(得分:8)

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

答案 6 :(得分: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>

答案 7 :(得分:2)

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

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

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

答案 8 :(得分:2)

=&GT;检查是否会部分安装一些应用程序实例。

=&GT;首先从卸载应用程序中卸载该实例。

=&GT;然后,清理,重建,并尝试部署。

这解决了我的问题。它也帮助了你。 最诚挚的问候。

答案 9 :(得分:2)

如果您正在使用Nuget来管理您的依赖项,我还有另一种方法可以执行此操作。我发现有时VS和Nuget不匹配,Nuget无法识别您的项目不同步。 packages.config会说一件事,但引用 - 属性中显示的路径将指示其他内容。

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

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

  2. 选择已安装的套餐&#39;左侧窗格中的选项卡记录已安装的     包你可能想要将packages.config复制到你的     桌面首先如果你有很多,所以你可以交叉检查     谷歌看看Nuget pkgs的安装情况

  3. 卸载您的软件包。没关系,我们马上就把它们加回来。

  4. 立即安装您需要的软件包。 Nuget将会做的不仅是为您提供最新版本,还会更改您的参考资料,还会为您添加绑定重定向。

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

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

  7. 您可能希望从较低级别的项目开始,然后按照自己的方式进行更高级别的项目,并在进行时重建每个项目。

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

  1. 打开“解决方案资源管理器”。
  2. 点击“显示所有文件”
  3. 展开“参考”
  4. 您会看到一个(或多个)引用的图标与其他引用略有不同。通常,它是黄色框,建议你记下它。只需删除它。
  5. 添加引用并编译代码。
  6. 就是这样。
  7. 就我而言,MySQL引用存在问题。不知何故,我可以列出所有可用参考文献列表中的三个版本; .net 2.0,.net 4.0和.net 4.5。我按照上面的过程1到6进行操作,它对我有用。

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

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

  2. 单击右上角的齿轮

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

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

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

轻松自在

答案 17 :(得分:0)

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

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

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来自ClosedXML的NuGet,它取决于FastMember.dll 1.3.0.0。最重要的是,项目中还有FastMember个Nuget,并且它有FastMember.dll 1.5.0.0。不匹配!

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

答案 18 :(得分:0)

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

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

对于我来说,冲突的软件包通常是我自己的,因此我可以修复依赖性问题并重新发布。