【问题标题】:Warning: Found conflicts between different versions of the same dependent assembly警告:发现同一依赖程序集的不同版本之间存在冲突
【发布时间】:2010-09-06 06:40:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: .net warnings


    【解决方案1】:

    我遇到了同样的问题。在项目的“obj”文件夹中,我将文件夹“Debug”重命名为“Debug_OLD”并重建。自动构建了一个新的“调试”文件夹,问题就消失了。

    【讨论】:

      【解决方案2】:

      这是 .NET Core 3.0 风格的解决方案: https://github.com/HTD/ref-check

      当你发现什么冲突时,也许你就能解决这些冲突。 如果冲突的引用来自其他包,那么您要么不走运,要么需要改用源代码。

      就我而言,冲突的包通常是我自己的,所以我可以修复依赖问题并重新发布它们。

      【讨论】:

        【解决方案3】:

        我刚刚花了一些时间调试同样的问题。请注意,该问题可能不在不同项目之间,而实际上在一个项目中依赖于同一 dll/程序集的不同版本的多个引用之间。就我而言,问题是来自单个项目中两个不同 NuGet 包的引用 FastMember.dll 版本不匹配。当我得到一个项目时,它无法编译,因为 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。不匹配!

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

        【讨论】:

          【解决方案4】:

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

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

          2. 点击右上角的齿轮

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

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

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

          简单易懂

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                【解决方案7】:

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

                以下是识别违规引用的几种方法:

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

                【讨论】:

                • 仅作为一种无需实用程序即可快速找到它的方法——如果您确实添加了绑定重定向(作为选项 2),它将在那里显示所涉及的参考资料——如果需要,您然后可以使用其他方法之一来处理它,并从配置文件中删除绑定重定向。
                • 查找“违规引用”的最简单方法是设置生成输出详细程度(工具、选项、项目和解决方案、生成和运行、MSBuild 项目生成输出详细程度、详细)构建后,在输出窗口中搜索警告。看上面的文字。
                • 通过双击警告绑定重定向(第 2 步)不会删除我的警告。我看到 app.config 添加了我怀疑是原因的程序集,但在清理/重建后警告仍然存在。另外还尝试了第3步,没有运气。有什么想法吗?
                • 如果它们不是您自己项目的引用怎么办?比如我引用了一个项目,它依赖于Newtonsoft.Json,Version=6.0.0.0,我又引用了另一个项目,它依赖于Newtonsoft.Json,Version=4.5.0.0
                • @brian-low,我可以建议在链接实用程序旁边的答案中添加构建输出详细程度设置(如@paulya 评论中所建议的)作为选项吗? (免责声明,我实际上试图编辑答案来做到这一点,但在审查时被拒绝:))
                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

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

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

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

                  这解决了我的问题。希望它对你也有帮助。 最好的问候。

                  【讨论】:

                    【解决方案10】:

                    在 Visual Studio 上,如果您右键单击 solutionManage nuget packages,则会有一个 "Consolidate" 选项卡将所有包设置为同一个版本。

                    【讨论】:

                      【解决方案11】:

                      我想发布他们在上面的 cmets 中提供的 paulaya 的解决方案。我相信这是查找违规引用的最佳解决方案。

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

                      【讨论】:

                      • 但是现在我有了这些信息,我该如何消除错误呢?我可以看到冲突是什么,但我找不到项目引用冲突版本的位置
                      • 嗨@Bassie,首先要做的是检查您的nuget包文件并确定您是否需要将所有文件更新到相同版本的包。您可以按照我在此处的回答 stackoverflow.com/questions/22685530/… 运行类似于 update-package [your package name] -version 6.0.0 -reinstall 的命令来执行此操作
                      • @Bassie,您可以按照警告的建议执行操作,并将绑定重定向添加到 app.config 文件中! (如果更新不是一种选择,那就是。)
                      • @Bassie 看到我的回答,我向您展示了如何获取导致不匹配问题的不同程序集/.dll。
                      【解决方案12】:

                      我遇到了同样的问题,我通过更改 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>
                      

                      【讨论】:

                      • 这是我的解决方案。我有一个绑定重定向到更高版本,它只有在我移动到较低版本后才有效。
                      • 为什么?对我来说太奇怪了。我不使用 EF,但我认为我们总是想移到最后一个版本?
                      • @HoàngLong 因为您引用的版本是旧版本,但您包含的版本是新版本。
                      【解决方案13】:

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

                      【讨论】:

                        【解决方案14】:
                        1. 打开“解决方案资源管理器”。
                        2. 点击“显示所有文件”
                        3. 展开“参考”
                        4. 您会看到一个(或多个)参考,其图标与其他参考略有不同。通常,它带有黄色框,建议您记下它。只需将其删除。
                        5. 重新添加引用并编译您的代码。
                        6. 就是这样。

                        就我而言,MySQL 引用存在问题。不知何故,我可以在所有可用参考列表下列出它的三个版本;适用于 .net 2.0、.net 4.0 和 .net 4.5。我遵循了上面的过程 1 到 6,它对我有用。

                        【讨论】:

                          【解决方案15】:

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

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

                          1. 在解决方案资源管理器中,右键单击项目并单击“管理” Nuget 包的

                          2. 在左侧窗格中选择“已安装的包”选项卡记录您的安装 包您可能希望将您的 packages.config 复制到您的 如果你有很多桌面,那么你可以交叉检查它 谷歌查看安装了哪些 Nuget pkgs

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

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

                          5. 对所有项目执行此操作。

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

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

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

                          【讨论】:

                            【解决方案16】:

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

                            【讨论】:

                              【解决方案17】:

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

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

                              【讨论】:

                              • 这里有同样的问题。但是,我没有机会更新对较新版本的引用。我尝试使用 App.config:虽然它适用于应用程序,但 Visual Studio 2010 似乎在构建过程中忽略了它。
                              • 哇,我遇到这些问题已经两个月了,无法查明并解决它。出于某种原因,它只会在调试期间崩溃,并且在某些情况下,它会在发生这种情况时将麻烦的 .dll 手动替换为 bin 文件夹中的真实文件。调试真的很痛苦。当我读到你的回答时,我意识到这正是发生在我身上的事情,我在 5 分钟内修复了它:)
                              【解决方案18】:

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

                              【讨论】:

                              • 仅在您重建解决方案之前
                              • 这救了我!从昨天开始我一直在尝试其他解决方案,但是这个解决了我的问题。包括上面的评论^。谢谢!
                              【解决方案19】:

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

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

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

                              【讨论】:

                                【解决方案20】:

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

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

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

                                希望这是有道理的!

                                【讨论】:

                                  猜你喜欢
                                  • 2014-06-26
                                  • 2013-05-22
                                  • 1970-01-01
                                  • 2010-12-24
                                  • 2018-12-07
                                  • 1970-01-01
                                  • 2014-01-25
                                  相关资源
                                  最近更新 更多