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

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

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

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

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

208623 次浏览

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

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

我解决这个问题的方法是在组装项目中将Copy Local设置为False。只针对可执行文件/web应用程序,在这些应用程序中,您需要运行成品的程序集。

希望这有意义!

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

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

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

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

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

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

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

这里有几个方法来识别不合适的推荐人:

  • 您可以使用一个实用程序,例如在 李https://gist.github.com/1553265 < / > 另一个简单的方法是设置Build 输出冗长(工具,选项,项目和解决方案,构建和 运行,MSBuild项目构建输出详细,详细)之后 构建时,在输出窗口中搜索警告,并查看 文字就在上面。(向pauloya致敬,他在 对这个答案的评论).
  • .

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

我在我的一个项目中也遇到了同样的问题,然而,上面没有一个有助于解决警告。我检查了详细的构建日志文件,我使用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)

我希望上面的说明说明了我的意思,我花了几个小时才发现,所以希望其他人也能从中受益。

这也发生在我身上。一个dll被引用了两次:一次直接(在引用中),一次间接(被另一个引用的项目引用)。 我删除了直接参考,清洁&重建方案。固定的问题。< / p >

如果你使用Nuget来管理依赖项,我还有另一种方法。我发现有时候VS和Nuget不匹配,Nuget无法识别你的项目不同步。的包。config会说一件事,但在References - Properties中显示的路径将指示其他内容。

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

    在“解决方案资源管理器”中,右键单击“项目”并单击“管理” 李Nuget包' < / p > < / >
  1. 在左侧窗格中选择“Installed packages”选项卡 你可能想要复制你的包。配置到您的 桌面优先,如果你有很多,这样你可以交叉检查

  2. .谷歌查看安装了什么Nuget pkgs
  3. 卸载软件包。好的,我们马上把它们加回去。

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

  5. 对你所有的项目都这样做。

  6. 在解决方案级别,执行Clean and Rebuild。

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

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

  1. 打开“解决方案资源管理器”。
  2. 点击“显示所有文件”
  3. 扩大“引用”
  4. 您将看到一个(或多个)引用与其他引用的图标略有不同。通常情况下,它会有一个黄色的方框,建议你记下它。把它拿掉。
  5. 重新添加引用并编译代码。
  6. 这是所有。

在我的例子中,MySQL引用有一个问题。不管怎样,我可以在所有可用的引用列表下列出它的三个版本;适用于。net 2.0、。net 4.0和。net 4.5。我遵循了上面的方法1到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>

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

我想在上面的评论中发布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之间存在冲突。

在Visual Studio中,如果你右键单击解决方案管理nuget包,会有一个“巩固”选项卡,它将所有的包设置为相同的版本。

=>检查将有一些实例的应用程序部分安装。

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

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

这解决了我的问题。希望它也能帮助到你。 致以最亲切的问候。< / p >

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

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

当我的项目引用NETStandardLibrary时,我遇到了这样的问题,其中一个引用的程序集发布了netcore。只要把它作为网络标准发布,问题就解决了

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

  1. 右键单击项目,单击管理NuGet包..

  2. 点击右上角的齿轮

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

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

  5. 清理重建,警告就没了

容易peasy

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

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

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。不匹配!

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

下面是解决方案,.NET Core 3.0风格: https://github.com/HTD/ref-check < / p > 当你发现了什么冲突,也许你就能解决这些冲突。 如果冲突的引用来自其他包,那么要么你运气不好,要么你需要使用源代码

在我的例子中,冲突的包通常是我自己的,所以我可以修复依赖关系问题并重新发布它们。

我也有同样的问题。在项目的“obj”文件夹中,我将文件夹“Debug”重命名为“Debug_OLD”并重新构建。一个新的“Debug”文件夹会自动生成,问题也就解决了。

在花了几个小时分析详细的构建日志之后,我发现我的解决方案中的几个项目针对的是不同的. net版本。我将它们全部更改为. net 4.7.2并重新构建解决方案,错误得到解决。