.NET 7类库自托管ASP.NET Core编译正常但运行时加载失败
问题原因分析
- 宿主程序未声明共享框架依赖:你的类库项目虽然引用了
Microsoft.AspNetCore.App共享框架,但作为自托管Web API入口的控制台宿主程序,并没有添加对应的FrameworkReference。.NET共享框架的程序集不会被复制到输出目录,而是由运行时从全局位置加载,只有当宿主程序明确声明依赖时,CLR才会在运行时自动加载共享框架中的程序集。 - 类型加载上下文限制:通过
Type.GetType加载类库中的类型时,默认的程序集加载上下文没有包含共享框架的搜索路径。因为宿主程序未声明依赖,运行时不会将Microsoft.AspNetCore.App的程序集路径纳入搜索范围,导致后续调用该类型的方法时,找不到依赖的ASP.NET Core程序集。
正确的共享框架依赖管理方式
- 给控制台宿主项目添加共享框架引用:在控制台项目的
.csproj中添加以下配置,确保运行时能识别并加载Microsoft.AspNetCore.App共享框架:
类库项目的该引用保留,但必须确保宿主程序也添加此配置,这是解决问题的核心。<FrameworkReference Include="Microsoft.AspNetCore.App" /> - 禁止手动复制共享框架DLL:手动复制
Microsoft.AspNetCore.dll到输出目录会绕过.NET共享框架的版本管理机制,可能引发版本冲突、部署体积增大、后续框架更新无法生效等问题,完全不可取。 - 确保项目目标框架一致:类库和控制台宿主项目的目标框架必须统一为
net7.0,避免因框架版本不匹配导致的程序集加载异常。 - 优化类型加载逻辑:如果必须通过
Type.GetType加载类型,可在加载前初始化ASP.NET Core的WebHost(比如调用WebApplication.CreateBuilder),此时运行时会自动解析共享框架的依赖路径,无需手动干预。
内容的提问来源于stack exchange,提问作者ElDog
相关产品推荐
相关产品推荐

