在.NET 9和.NET 10上线程状态销毁后托管代码

Curtis Chau
Curtis Chau
Updated: 2026年6月10日

在.NET 9.0.5及更高版本(包括.NET 10)上使用IronPDF的应用程序退出并显示致命断言错误和退出代码127。

Attempt to execute managed code after the .NET runtime thread state has been destroyed.
Text

微软在.NET 9.0.5中引入了更严格的FLS(纤维局部存储)线程清理。操作系统控制FLS回调执行的顺序,这可能在IronPDF的Chrome渲染器完成其自身的关闭序列之前触发CLR拆卸。 此问题是Windows特有的; Linux和macOS不受影响。 .NET 6、7和8正常退出。 IronPDF的PDF生成在断言触发之前成功完成。 微软将该问题标记为"将来",没有计划修复日期。

选项

选项1:降级到.NET 8(推荐)

.NET 6.0.36和.NET 8.0.26正常退出。 如果需要干净的进程退出,请降级目标框架。

选项2:在CI/CD中使用测试结果文件而不是退出代码

在断言触发之前PDF工作成功完成。 从结果文件发布测试结果而不是依赖退出代码:

Azure DevOps:

- script: dotnet test --logger "trx" || true
- task: PublishTestResults@2
  inputs:
    testResultsFiles: '**/*.trx'
YAML

GitHub Actions:

- run: dotnet test --logger "trx" || true
- uses: dorny/test-reporter@v1
  with:
    path: '**/*.trx'
    reporter: dotnet-trx
YAML

选项3:在shell中过滤退出代码

dotnet run 2>stderr.log; EXIT=$?
if grep -q "thread state has been destroyed" stderr.log; then exit 0; else exit $EXIT; fi
SHELL

已知不可行的缓解措施:Environment.Exit(0),以及在退出前手动进行GC收集。

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

阅读更多

准备开始了吗?

Nuget Downloads 21,739,885版本:2026.10刚刚发布