如何解决.NET 5主应用引用.NET Framework 4.8类库插件的资源依赖问题
解决方法
.NET 5作为.NET Core分支的运行时,本身不内置System.Web.Services这类.NET Framework专属程序集,要在宿主无静态依赖的前提下解决插件依赖问题,按以下步骤操作即可:
- 插件端配置依赖输出
给.NET Framework 4.8插件项目安装Microsoft.Windows.CompatibilityNuGet包,该包封装了.NET Core运行时可兼容的.NET Framework API实现,包含System.Web.Services的可用版本。同时在插件的.csproj文件中添加如下配置,强制编译时将所有依赖程序集输出到生成目录:
这一步完成后,所有插件需要的依赖都会随插件本身生成到同目录,不需要宿主提前引用任何相关包。<PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> - 调整宿主的插件加载逻辑
在宿主创建插件对应的AssemblyLoadContext时,注册自定义的程序集解析回调,优先从插件所在目录搜索加载缺失的依赖,不要走宿主默认的程序集搜索路径,示例代码如下:string pluginDirectory = Path.GetDirectoryName(pluginAssemblyPath); AssemblyLoadContext pluginAlc = new AssemblyLoadContext($"Plugin_{Guid.NewGuid()}", isCollectible: true); pluginAlc.Resolving += (alc, assemblyName) => { string targetAssemblyPath = Path.Combine(pluginDirectory, $"{assemblyName.Name}.dll"); if (File.Exists(targetAssemblyPath)) { return alc.LoadFromAssemblyPath(targetAssemblyPath); } return null; }; - 兼容性检查
如果插件用到了System.Web.Services中未被兼容包实现的老旧API,可以将相关逻辑替换为System.ServiceModel下的等效实现,或者将依赖的原生.NET Framework程序集手动放到插件目录下,会被自定义的解析逻辑正常加载。
内容的提问来源于stack exchange,提问作者rastro
相关产品推荐
相关产品推荐

