WPF (.NET 6)使用Assembly.LoadFrom无法正确加载引用的问题
.NET 6插件依赖加载问题解决方案
问题核心
.NET 6(及.NET Core系列)的程序集加载策略和.NET Framework存在差异:.NET Framework会自动从应用程序基目录加载依赖,但.NET 6默认不会自动扫描关联依赖,哪怕依赖文件在根目录,也无法被Assembly.LoadFrom加载的插件自动发现,这就是抛出FileNotFoundException的原因。Assembly.LoadFrom在.NET 6中仍然可用,但行为逻辑已调整。
替代方案
1. 使用AssemblyLoadContext(推荐)
这是.NET Core/.NET 6官方推荐的插件加载方式,可为插件创建独立加载上下文,自定义依赖搜索逻辑,无需提前手动加载依赖:
var pluginPath = Path.GetFullPath("MyPlugin.dll"); var pluginDir = Path.GetDirectoryName(pluginPath); var loadContext = new AssemblyLoadContext(null, isCollectible: true); // 注册依赖解析回调 loadContext.Resolving += (ctx, assemblyName) => { var assemblyFilePath = Path.Combine(pluginDir, $"{assemblyName.Name}.dll"); return File.Exists(assemblyFilePath) ? ctx.LoadFromAssemblyPath(assemblyFilePath) : null; }; // 加载插件程序集 var pluginAssembly = loadContext.LoadFromAssemblyPath(pluginPath); // 后续扫描IPlugin实现逻辑...
该方式既保持主程序与插件的隔离,又能自动处理插件的依赖加载。
2. 配置程序集探测路径
通过配置让运行时自动扫描应用根目录的依赖,还原类似.NET Framework的行为:
- 在主项目
.csproj中添加:
<PropertyGroup> <RuntimeHostConfigurationOption Include="additionalProbingPaths" Value="." /> </PropertyGroup>
- 或手动修改
runtimeconfig.json:
{ "runtimeOptions": { "additionalProbingPaths": ["."] } }
3. 插件目录隔离
将插件及其依赖统一放在独立子目录中,加载时以该目录为基础路径创建AssemblyLoadContext,运行时会自动扫描该目录下的依赖,同时避免根目录文件混乱。
内容的提问来源于stack exchange,提问作者rholek
相关产品推荐
相关产品推荐

