.NET Framework迁移至.NET Core 8后Assembly.LoadFrom加载失败问题
.NET Core 8中Assembly.LoadFrom加载程序集失败的解决方案
核心原因
.NET Core/.NET 5+的程序集加载机制与.NET Framework差异显著:前者对程序集路径、架构匹配、加载上下文的要求更严格,Assembly.LoadFrom的行为也做了调整,不再兼容.NET Framework中宽松的加载逻辑。
排查与解决步骤
1. 确认路径完整性
首先检查待加载程序集的路径是否包含完整的.dll后缀:
.NET Framework会自动尝试补全缺失的.dll后缀,但.NET Core不会。你的代码中路径DT0WDX13缺少后缀,需修改为:
var path = @"D:\Code\Trial\App1\App1\bin\x86\Debug\net8.0-windows10.0.18362.0\DT0WDX13.dll";
2. 使用AssemblyLoadContext加载(推荐方案)
.NET Core推荐通过AssemblyLoadContext管理外部程序集加载,避免上下文冲突,这也是最可靠的方式:
using System.Runtime.Loader; private void myButton_Click(object sender, RoutedEventArgs e) { myButton.Content = "Clicked"; var dllPath = @"D:\Code\Trial\App1\App1\bin\x86\Debug\net8.0-windows10.0.18362.0\DT0WDX13.dll"; // 创建可回收的自定义加载上下文 var loadContext = new AssemblyLoadContext(null, isCollectible: true); try { var assembly = loadContext.LoadFromAssemblyPath(dllPath); // 加载成功后可执行后续逻辑,比如反射调用类型 } catch (Exception ex) { myButton.Content = $"加载失败: {ex.Message}"; } finally { // 释放加载上下文(仅当isCollectible为true时生效) loadContext.Unload(); } }
3. 验证架构匹配
确保待加载的.dll与当前应用的目标架构完全一致:
- 你的应用编译为
x86,需确认DT0WDX13.dll也是x86架构编译的; - 若架构不匹配,会抛出
BadImageFormatException,此时需调整应用或待加载程序集的目标架构。
4. 捕获异常定位具体问题
在代码中捕获异常,根据错误信息精准排查:
FileNotFoundException:路径错误、文件不存在或权限不足;BadImageFormatException:架构不兼容、程序集损坏或不是.NET程序集;FileLoadException:程序集已被加载到其他上下文,或存在版本冲突。
补充说明
Assembly.LoadFrom在.NET Core中仅适用于加载应用依赖链中的程序集,对于外部独立程序集,AssemblyLoadContext是更合适的选择,它能隔离加载的程序集,避免影响主应用的上下文。
内容的提问来源于stack exchange,提问作者Jean-Marc
相关产品推荐
相关产品推荐

