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

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

Warning: Found conflicts between different versions of the same dependent assembly

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

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

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

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


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

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

  • 添加绑定重定向。这将抑制警告。但是,您的.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
    • 另一个简单的方法是设置Build
      输出详细程度(工具,选项,项目和解决方案,构建和
      运行,MSBuild项目构建输出详细程度,详细)和之后
      构建,在输出窗口中搜索警告,然后查看
      正上方的文字。 (帽子小贴士向pauloya提出了这个建议
      对这个答案的评论)。

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

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

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

    希望有道理!


    我想发布他们在上面的评论中提供的pauloya解决方案。我相信这是找到违规参考的最佳解决方案。

    The simplest way to find what are the"offending reference(s)" is to
    set Build output verbosity (Tools, Options, Projects and Solutions,
    Build and Run, MSBuild project build output verbosity, Detailed) and
    after building, search the output window for the warning. See the text
    just above it.

    例如,当您在输出面板中搜索"冲突"时,您可能会发现以下内容:

    1
    2
    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之间存在冲突。


    我的一个项目遇到了同样的问题,但是,上述任何一个都没有帮助解决警告。我检查了详细的构建日志文件,我使用AsmSpy来验证我在受影响的解决方案中为每个项目使用了正确的版本,我仔细检查了每个项目文件中的实际条目 - 没有任何帮助。

    最终它发现问题是我在一个项目中的一个引用的嵌套依赖项。该引用(A)又需要不同版本的(B),它直接从我的解决方案中的所有其他项目引用。更新引用项目中的引用解决了它。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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)

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


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


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


    我有同样的问题,我通过在web.config中更改以下内容来解决。

    它发生在我身上,因为我正在使用Newtonsoft.Json 4.0运行应用程序

    从:

    1
    2
    3
    4
    <dependentAssembly>
     
      <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
    </dependentAssembly>

    至:

    1
    2
    3
    4
    <dependentAssembly>
     
      <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0" />
    </dependentAssembly>

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

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

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


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

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

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

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


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

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

  • 在Solution Explorer中,右键单击Project并单击"Manage"
    Nuget Packages'

  • 在左侧窗格中选择"已安装的包"选项卡记录已安装的
    包你可能想要将packages.config复制到你的
    桌面首先如果你有很多,所以你可以交叉检查
    谷歌看看Nuget pkgs的安装情况

  • 卸载您的包。没关系,我们马上就把它们加回来。

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

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

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

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

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


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


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

  • 右键单击项目,然后单击Manage NuGet Packages ..

  • 单击右上角的齿轮

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

  • 在"绑定重定向"中选中"跳过应用绑定重定向"

  • 清洁和重建,警告消失了

  • 十分简单


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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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
    et461\FastMember.dll]. (TaskId:19)
    1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib
    et461\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
    et461\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
    et46\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
    et46\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
    et46\ClosedXML.dll"

    ClosedXML.dll来自ClosedXML NuGet,它取决于FastMember.dll 1.3.0.0。最重要的是,项目中还有FastMember Nuget,它有FastMember.dll 1.5.0.0。不匹配!

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


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


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


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


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


  • 打开"Solution Explorer"。
  • 点击"显示所有文件"
  • 展开"参考"
  • 您会看到一个(或多个)引用的图标与其他引用略有不同。通常,它是黄色框,建议你记下它。只需删除它。
  • 添加引用并编译代码。
  • 就这样。
  • 就我而言,MySQL引用存在问题。不知何故,我可以列出所有可用参考文献列表中的三个版本; .net 2.0,.net 4.0和.net 4.5。我按照上面的过程1到6进行了操作,它对我有用。


    推荐阅读