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

This article was translated from English: Does it need improvement?
Translated
View the article in English

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

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

微软在.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'
- 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
- 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
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
技术作家

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

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

准备开始了吗?
Nuget 下载 20,088,359 | 版本: 2026.7 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronPdf
运行示例看着你的HTML代码变成PDF文件。