在.NET 9和.NET 10上线程状态销毁后托管代码
在.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'
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
选项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
已知不可行的缓解措施:Environment.Exit(0),以及在退出前手动进行GC收集。

