.NET6迁移后Microsoft.AspNetCore.Server.Kestrel.Transport.Quic加载错误排查
问题解决与.NET6迁移指南
一、本地查看程序集加载位置的方法
1. 代码方式记录加载日志
在Program.cs中添加程序集加载事件,记录每个程序集的加载路径与版本:
using System.Reflection; using System.IO; AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { try { var assembly = Assembly.Load(args.Name); if (assembly != null) { File.AppendAllText( "assembly-load-log.txt", $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] Loaded: {args.Name}{Environment.NewLine}Path: {assembly.Location}{Environment.NewLine}{Environment.NewLine}" ); } return assembly; } catch (Exception ex) { File.AppendAllText( "assembly-load-log.txt", $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] Failed to load: {args.Name}{Environment.NewLine}Error: {ex.Message}{Environment.NewLine}{Environment.NewLine}" ); return null; } }; // 原有Program.cs业务代码继续...
运行程序后,当前目录会生成assembly-load-log.txt,可从中查看目标程序集的加载细节。
2. 工具方式查看
使用Process Explorer:
- 启动本地API程序
- 打开Process Explorer找到对应进程,右键选择「Properties」→「Modules」
- 在列表中定位
Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.dll,查看「Path」列的实际路径与版本。
二、解决程序集版本不匹配问题
1. 对齐本地与CI/CD的.NET SDK版本
自包含发布的依赖版本由构建环境的.NET SDK决定,若本地用6.0.4 SDK、CI/CD用6.0.0,会导致依赖版本不一致:
- 在CI/CD环境安装6.0.4版本的.NET SDK,或在发布命令中显式指定Runtime版本:
dotnet publish --runtime win-x64 --self-contained -c release -o build -p:RuntimeVersion=6.0.4
2. 显式指定NuGet包版本
在项目文件(.csproj)中添加目标包的显式引用,锁定版本为6.0.4:
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Quic" Version="6.0.4" />
执行dotnet restore后重新发布。
3. 清理CI/CD缓存与旧构建文件
CI/CD服务器可能残留旧版本构建文件引发冲突:
- 删除工作目录下的
build、bin、obj等旧文件夹 - 重新执行构建发布流程
4. 检查.runtimeconfig.json配置
查看发布目录下的<YourApp>.runtimeconfig.json,确认framework.version为6.0.4:
{ "runtimeOptions": { "tfm": "net6.0", "framework": { "name": "Microsoft.NETCore.App", "version": "6.0.4" } } }
若版本错误,重新发布或手动修正后重启服务。
三、完整的.NET6迁移步骤(从.NET Core 3.1)
- 修改项目目标框架:将
.csproj中的TargetFramework从netcoreapp3.1改为net6.0 - 升级NuGet依赖:将所有包升级到兼容.NET6的稳定版本(优先选择6.x系列)
- 调整Program.cs结构:可移除
Startup.cs,改用.NET6顶级语句模式整合配置与中间件;若保留Startup,需适配Program.cs的CreateHostBuilder逻辑 - 验证中间件配置:检查
UseRouting、UseEndpoints等中间件顺序,符合.NET6推荐配置 - 本地功能测试:启动服务验证所有接口、业务逻辑正常运行
- 标准化发布流程:
- 使用与本地一致的.NET SDK版本执行发布
- 自包含发布时显式指定Runtime版本(如
-p:RuntimeVersion=6.0.4) - 确保CI/CD环境SDK版本与本地完全对齐
- 清理与验证:清理本地和CI/CD的旧构建缓存,发布后检查目标目录依赖文件版本是否正确
内容的提问来源于stack exchange,提问作者Jacek
相关产品推荐
相关产品推荐

