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

oll*_*ant 309 .net warnings

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

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

"Found conflicts between different versions of the same dependent assembly".
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*Low 400

此警告意味着两个项目引用相同的程序集(例如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上的实用程序
  • 另一个简单的方法是设置构建输出详细程度(工具,选项,项目和解决方案,构建和运行,MSBuild项目构建输出详细程度,详细),并在构建后,在输出窗口中搜索警告,并查看其上方的文本. (帽子提示pauloya谁在这个答案的评论中建议这一点).

  • 查找"违规引用"的最简单方法是设置构建输出详细程度(工具,选项,项目和解决方案,构建和运行,MSBuild项目构建输出详细程度,详细信息),构建后,搜索输出窗口警告.见上面的文字. (213认同)
  • 只需一个快速的方法来找到它没有实用程序 - 如果你确实添加了绑定重定向(作为选项2),它将显示所涉及的引用 - 如果需要,您可以使用其他方法之一处理它,并从配置文件中删除绑定重定向. (9认同)
  • 如果他们不是您自己项目的参考怎么办?例如,我引用了一个项目,该项目依赖于Newtonsoft.Json,Version = 6.0.0.0,我引用了另一个项目,该项目依赖于Newtonsoft.Json,Version = 4.5.0.0 (9认同)
  • 通过双击警告绑定重定向(步骤2)不会删除我的警告.我看到app.config添加了我怀疑是原因的程序集,但是在清理/重建之后警告仍然存在.另外尝试了第3步,没有运气.有任何想法吗? (7认同)
  • @ brian-low,我可以建议在链接实用程序旁边添加Build输出详细程度设置(如@pauloya的评论中所示)作为选项吗?(免责声明,我实际上试图编辑答案来做到这一点,但它在审查时被拒绝:)) (3认同)
  • 此处链接也是+1.快速解决了我的问题. (2认同)
  • 这个问题似乎反映了一个基本问题:目前还没有有效的方法(至少我不知道)来管理 .NET 中的依赖项。NuGet 和 Visua Studio 继续互相咬... 不同的库模块依赖于同一个第三方库的不同版本有什么问题?如果我们重定向库以始终使用较新版本,则可能会出现问题。 (2认同)

Mat*_*ton 43

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

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

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

希望有道理!


use*_*388 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.
Run Code Online (Sandbox Code Playgroud)

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

  • 但是现在我有了这些信息,我该如何消除错误?我可以看到冲突是什么,但我找不到项目引用冲突版本的位置 (5认同)

Gor*_*ger 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)
Run Code Online (Sandbox Code Playgroud)

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


Tia*_*vêa 18

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


MoM*_*oMo 8

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

  • 直到你重建解决方案为止 (9认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)

至:

<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>
Run Code Online (Sandbox Code Playgroud)