代码之家  ›  专栏  ›  技术社区  ›  ollifant

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

  •  303
  • ollifant  · 技术社区  · 16 年前

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

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

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

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

    15 回复  |  直到 6 年前
        1
  •  390
  •   Rick Riensche Brian Low    6 年前

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

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

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

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

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

    • 您可以使用一个实用程序,如 https://gist.github.com/1553265
    • 另一个简单的方法是设置build 输出详细信息(工具、选项、项目和解决方案、构建和 run,msbuild project build output verbosity,detailed)和after 生成,搜索输出窗口中的警告,然后查看 上面的文字。 (帽子尖到 pauloya 是谁在 对此答案的评论) .
        2
  •  42
  •   Matt Hamilton    16 年前

    基本上,当您所引用的程序集的“copy local”设置为“true”时就会发生这种情况,这意味着一个dll副本与您的exe一起放在bin文件夹中。

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

    我绕过这个问题的方法是,在程序集项目中为引用将copy local设置为false。仅对需要程序集才能运行成品的可执行文件/Web应用程序执行此操作。

    希望这有道理!

        3
  •  30
  •   user1477388    8 年前

    我想把他们在上面的评论中提出的保罗亚的解决方案贴出来。我认为这是找到有冒犯性的推荐信的最佳解决方案。

    找到“冒犯性参考”的最简单方法是 设置生成输出详细信息(工具、选项、项目和解决方案, 生成并运行,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之间存在冲突。

        4
  •  19
  •   Gorgsenegger    11 年前

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

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

        5
  •  13
  •   Tiago Gouvêa    8 年前

    如果右键单击 解决方案 管理Nuget包 有一个 “巩固” 将所有包设置为相同版本的选项卡。

        6
  •  8
  •   MoMo    12 年前

    我刚刚收到这个警告消息,清理了解决方案并重新编译(build->clean solution),它就消失了。

        7
  •  6
  •   Dave New    9 年前

    我有同样的问题,我通过在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>
    
        8
  •  2
  •   Jon Limjap    16 年前

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

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

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

        9
  •  2
  •   Bill    10 年前

    如果您使用Nuget来管理依赖项,我还有另一种方法可以做到这一点。我发现有时候vs和nuget不匹配,nuget无法识别你的项目不同步。packages.config只会说一件事,但references-properties中显示的路径将指示其他事情。

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

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

    2. 在左窗格中选择“Installed Packages”(已安装的软件包)选项卡记录已安装的 您可能希望将packages.config复制到 如果你有很多东西,先用桌面,这样你就可以交叉检查 谷歌查看安装了什么nuget包

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

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

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

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

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

    如果不想更新依赖项,则可以使用包管理器控制台,并使用语法update package-projectname[your projectname][packagename]-version[versionnumber]

        10
  •  2
  •   Neelam Prajapati    7 年前

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

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

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

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

        11
  •  1
  •   Tristan Lewis    9 年前

    还有这个问题——在我的例子中,它是由一些引用的“特定版本”属性设置为“真”引起的。在这些引用中将此更改为false解决了问题。

        12
  •  0
  •   Igor Gorjanc    10 年前

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

        13
  •  0
  •   Sukhi    10 年前
    1. 打开“解决方案资源管理器”。
    2. 单击“显示所有文件”
    3. 展开“引用”
    4. 您将看到一个(或多个)引用的图标与其他引用的图标略有不同。通常情况下,它带有黄色框,建议您记下它。把它拿走。
    5. 重新添加引用并编译代码。
    6. 这就是全部。

    在我的例子中,mysql引用有问题。不知怎么的,我可以在所有可用引用的列表中列出它的三个版本:对于.NET 2.0,.NET 4.0和.NET 4.5。我遵循上面的过程1到6,这对我很有效。

        14
  •  0
  •   Telwa Gangnam    7 年前

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

        15
  •  0
  •   Dpedrinha    6 年前

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