在树莓派上托管自包含ASP.NET Core应用遇类型加载异常
树莓派部署自包含ASP.NET Core Razor Pages应用出现TypeLoadException的解决方法
问题描述
在树莓派上托管自包含ASP.NET Core Web应用时,运行应用出现以下错误:
Unhandled exception. System.TypeLoadException: Could not load type 'Microsoft.AspNetCore.Mvc.ApplicationParts.ConsolidatedAssemblyApplicationPartFactory' from assembly 'Microsoft.AspNetCore.Mvc.Razor, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. at System.Reflection.RuntimeAssembly.GetTypeCore(String, ReadOnlySpan`1, Boolean, Boolean) at System.Reflection.TypeNameParser.GetType(String, ReadOnlySpan`1, String) at System.Reflection.TypeNameParser.NamespaceTypeName.ResolveType(TypeNameParser&, String) at System.Reflection.TypeNameParser.Parse() at System.Reflection.TypeNameParser.GetType(String, Func`2, Func`4, Assembly, Boolean , Boolean , Boolean ) at System.Reflection.TypeNameParser.GetType(String, Assembly, Boolean , Boolean ) at System.Type.GetType(String, Boolean) at Microsoft.AspNetCore.Mvc.ApplicationParts.ProvideApplicationPartFactoryAttribute.GetFactoryType() at Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartFactory.GetApplicationPartFactory(Assembly) at Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartManager.PopulateDefaultParts(String) at Microsoft.Extensions.DependencyInjection.MvcCoreServiceCollectionExtensions.GetApplicationPartManager(IServiceCollection, IWebHostEnvironment) at Microsoft.Extensions.DependencyInjection.MvcCoreServiceCollectionExtensions.AddMvcCore(IServiceCollection) at Microsoft.Extensions.DependencyInjection.MvcServiceCollectionExtensions.AddRazorPagesCore(IServiceCollection) at Microsoft.Extensions.DependencyInjection.MvcServiceCollectionExtensions.AddRazorPages(IServiceCollection) at Program.<Main>$(String[]) in C:\Users\mihas\source\repos\HelloWorld\Program.cs:line 4 Aborted
应用代码第4行为:
// Add services to the container. builder.Services.AddRazorPages();
采用自包含部署仍出现错误,尝试依赖框架部署并安装最新框架后问题依旧。
解决步骤
确认发布目标架构匹配树莓派
树莓派多为ARM架构(Pi 3及以下为ARM32,Pi 4及以上支持ARM64),发布时必须指定正确的Runtime Identifier(RID):- 针对ARM64树莓派:
dotnet publish -c Release -r linux-arm64 --self-contained true - 针对ARM32树莓派:
dotnet publish -c Release -r linux-arm --self-contained true
错误的RID会导致依赖库与架构不兼容,引发类型加载失败。
- 针对ARM64树莓派:
清理缓存并重新发布
删除项目根目录下的bin和obj目录,重新执行发布命令,避免旧缓存导致的依赖不一致问题。统一ASP.NET Core包版本
检查项目.csproj文件,确保所有Microsoft.AspNetCore.*相关包的版本完全一致(例如均为8.0.x),混合版本会导致类型定义不匹配。验证依赖框架部署的运行时版本
若使用依赖框架部署,在树莓派执行以下命令确认安装的运行时版本与项目目标框架一致:dotnet --list-runtimes确保存在与项目
TargetFramework(如net8.0)完全匹配的ASP.NET Core Runtime版本。确保发布输出完整复制
自包含发布后,将整个publish目录完整复制到树莓派,不要仅复制单个可执行文件,保证所有依赖DLL都被正确部署。
内容的提问来源于stack exchange,提问作者msmiha
相关产品推荐
相关产品推荐

