.Net5 版本容错程序集加载

.Net5 version-tolerant assembly loading

我在 .Net5/C# 中遇到以下情况,我正在努力解决。 我们有应用程序(我们称之为 Platform)U 能够加载插件,例如插件 P,引用 Utilities U,它是 Platform 的一部分并共享其版本。 我们的想法是,次要版本中的任何内容都应该兼容,即版本 3.1.x.y 的 A 应该能够加载任何版本 3.1.x.y.

的 P

现在,平台 已部署版本 3.1.1.10,我们要加载的插件 P 是针对版本 3.1.1.15 的应用程序 A 构建的。

这意味着,Platform 现在是 运行 Utilities U,它具有相同的版本 3.1.1.10。打包我们的插件时,我们不包括 Platform 中已经可用的任何内容,在本例中为 Utilities U.

加载插件时,我们调用:

Assembly.LoadFrom(pathToPluginDll);

毫不奇怪,在加载插件时,它还会尝试加载其依赖的 Utilities U 版本为 3.1.1.15(我们在此不提供)。

我现在想要的是简单地加载 Platform 已经提供的 Utilities 3.1.1.10。我怎样才能做到这一点?

我做了很多研究,但找不到任何有用的东西。 BindingRedirect 似乎是解决 .NET Framework 这个问题的简单方法,但不再适用于 .NET5。 我还尝试了 EnableDynamicLoading / RollForward 和 deps.json 文件,但没有成功。

提前感谢任何hints/help。我觉得我错过了一些简单的东西。

我找到了 AssemblyResolve 的解决方案:

internal PluginLoader() {
    AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolver;
}

...

private static Assembly AssemblyResolver(object source, ResolveEventArgs e) {
    var expectedAssembly = new AssemblyName(e.Name);
    var assembly = AppDomain.CurrentDomain.GetAssemblies()
        .SingleOrDefault(a => a.GetName().Name.Equals(expectedAssembly.Name));
    return VersionMatches(assembly.GetName().Version, expectedAssembly.Version) ? assembly : null;
}

我希望在某些配置级别(如绑定重定向)找到解决方案,但这看起来很简单。不过,如果有更好的解决方案,请告诉我。