在 .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(Fiber Local Storage)執行緒清理。操作系統控制 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
已知無效的緩解措施:Installation.SkipShutdown = true, SetErrorMode, Environment.Exit(0),以及退出前的手動垃圾收集。

