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

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

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

该警告到底意味着什么?是否有可能排除该警告(例如在源代码文件中使用#pragma disable)?

有帮助吗?

解决方案

此警告意味着两个项目引用相同的程序集(例如 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项目构建输出的杂句,详细),然后构建后,搜索输出窗口以获取警告,并查看其上方的文本。 (向 保洛亚 谁在有关此答案的评论中提出了这一点).

其他提示

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

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

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

希望这是有道理的!

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

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

我希望上面的内容说明了我的意思,我花了几个小时才找到答案,所以希望其他人也能受益。

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

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

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

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

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

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

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

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

  1. 从解决方案资源管理器中,右键单击项目,然后单击“管理Nuget软件包”

  2. 在左窗格中选择“已安装软件包”选项卡记录您的已安装软件包您可能需要将packages.config复制到桌面,如果有很多,则可以与Google交叉检查以查看安装了什么Nuget PKGS

  3. 卸载您的软件包。没关系,我们将立即将它们添加回来。

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

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

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

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

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

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

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

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

这解决了我的问题。希望它也能帮助你。此致。

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

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

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

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

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

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

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

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

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

  2. 单击右上角的齿轮

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

  4. 检查绑定重定向中的“跳过应用绑定重定向”

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

十分简单

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top