我在 .Net5/C# 中有以下情況,我正在努力解決。我們有應用程式(我們稱之為平臺)U,它能夠加載插件,例如插件 P,參考實用程式 U,它是平臺的一部分并共享其版本。我們的想法是,次要版本中的任何內容都應該兼容,即版本為 3.1.xy 的 A 應該能夠加載版本為 3.1.xy 的任何 P
現在,平臺部署了 3.1.1.10 版本,我們要加載的插件 P 是針對應用程式 A 構建的,版本為 3.1.1.15。
這意味著,Platform現在與具有相同版本 3.1.1.10 的 Utilities U 一起運行。在打包我們的插件時,我們不包括任何已經在Platform中可用的東西,在本例中是 Utilities U。
加載插件時,我們呼叫:
Assembly.LoadFrom(pathToPluginDll);
毫不奇怪,在加載插件時,它也會嘗試加載版本為 3.1.1.15 的依賴 Utilities U(我們在此不提供)。
我現在想要的是簡單地加載Platform已經提供的 Utilities 3.1.1.10 。我怎樣才能做到這一點?
我做了很多研究,但找不到任何作業。BindingRedirect 似乎是為 .NET Framework 解決此問題的一種簡單方法,但不再適用于 .NET5。我還嘗試了EnableDynamicLoading / RollForward和 deps.json 檔案,但沒有成功。
感謝您提前提供任何提示/幫助。我覺得我錯過了一些簡單的東西。
uj5u.com熱心網友回復:
我能夠使用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;
}
我希望在某些配置級別上找到解決方案(如系結重定向),但這看起來很容易。不過,如果有更好的解決方案,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/467288.html
