首页 文章

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

提问于
浏览
297

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

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

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

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

15 回答

  • 2

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

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

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

  • 0

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

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

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

    希望有道理!

  • 0

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

  • 0

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

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

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

    这解决了我的问题 . 它也帮助你 . 最好的祝福 .

  • 28

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

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

  • 8

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

  • 0

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

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

    • 在Solution Explorer中,右键单击Project并单击“Manage Nuget Packages”

    • 在左侧窗格中选择“已安装的软件包”选项卡记录已安装的软件包如果您有很多软件,可能需要先将packages.config复制到桌面,这样您就可以与Google交叉检查以查看Nuget pkgs的安装情况

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

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

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

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

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

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

  • 2
    • 打开"Solution Explorer" .

    • 点击"Show all files"

    • 展开"References"

    • 您会看到一个(或多个)引用的图标与其余部分略有不同 . 通常,它是黄色框,建议你记下它 . 只需删除它 .

    • 添加引用并编译代码 .

    • 就是这样 .

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

  • 18

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

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

  • 12

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

  • 6

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

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

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

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

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

    • 您可以使用https://gist.github.com/1553265中找到的实用程序

    • 另一个简单的方法是设置构建输出详细程度(工具,选项,项目和解决方案,构建和运行,MSBuild项目构建输出详细程度,详细),并在构建之后,在输出窗口中搜索警告,并查看上面的文本它 . (帽子提示pauloya谁在这个答案的评论中提出了这个建议) .

  • 2

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

  • 41

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

  • 386

    在Visual Studio上,如果右键单击 solutionManage nuget packages theres,则会将所有程序包设置为相同版本的 "Consolidate" 选项卡 .

相关问题