由于版本冲突,无法加载某个程序集
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