由于版本冲突,无法加载某个程序集

Posted

技术标签:

【中文标题】由于版本冲突,无法加载某个程序集【英文标题】:Cannot load a certain assembly due to version conflict 【发布时间】:2021-12-23 20:12:28 【问题描述】:

一个程序集(exe)依赖于一个nuget包(实际上是serilog.settings.configuration 3.1.0) 这个包依赖于 microsoft.extensions.options.configurationextensions (>=2.0.0) 又依赖于 microsoft.extensions.configuration.binder (>= 2.0.0) 这一切都很好。

但是,我在解决方案中有其他项目(类库)没有从 exe 项目中引用(将在运行时加载),其中一个依赖于较新版本的 microsoft.extensions.configuration.binder (6.0 .0) 一切都不好。 新版本无法加载,因为exe项目已经加载了旧版本。

我可以通过显式添加 microsoft.extensions.configuration.binder (6.0.0) 作为 exe 项目的依赖项来解决此问题,但我想有更好的方法可以做到这一点,是吗? (如果由于某种原因(例如用户选择)依赖于较新版本的动态加载的程序集未加载,我最终会在此过程中加载不必要的新程序集,在这种情况下可能不是大问题,但在其他情况下可能是)。

我正在使用 .Net 6,因此加载到单独的 AppDomain 是(afaik)不是一个选项

【问题讨论】:

【参考方案1】:

如果这些程序集是强命名的,那么使用 gacutil.exe 将它们的不同版本放入 GAC 应该可以解决问题。如果这对您不起作用,您仍然可以选择覆盖默认加载行为。 以下两篇文章很好地解释了这个主题(针对 NET Framework):

Understanding How Assemblies Load in C# .NET How to resolve .NET reference and NuGet package version conflicts

如果 AppDomain 和 AppDomain.CurrentDomain.AssemblyResolve 不适合您,请尝试使用 System.Runtime.Loader Namespace,特别是 AssemblyDependencyResolver class。

【讨论】:

谢谢我忘了告诉我正在使用带有 DirectoryModuleCatalog 的 Prism 8,它在使用提到的 Binder 依赖项初始化模块时抛出。不能像你提到的那样调整(除非利用开源)

以上是关于由于版本冲突,无法加载某个程序集的主要内容,如果未能解决你的问题,请参考以下文章

无法加载文件或程序集 'PayPalAdaptivePaymentsSDK,版本 = 2.12.117.0

无法加载文件或程序集'netstandard,版本 = 2.0.0.0

.Net Core T4 运行转换无法加载文件或程序集

无法加载文件或程序集'WebGrease,版本 = 1.5.1.25624 - 或任何其他版本

无法加载文件或程序集'Ninject 版本 4.0.0.0

无法加载文件或程序集 'Microsoft.SqlServer.Smo,版本 = 10.0.0