在 .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(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'
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

已知無效的緩解措施:Installation.SkipShutdown = true, SetErrorMode, Environment.Exit(0),以及退出前的手動垃圾收集。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

準備開始了嗎?
Nuget 下載 20,088,359 | 版本: 2026.7 剛剛發布
Still Scrolling Icon

還在捲動嗎?

想快速獲得證明嗎? PM > Install-Package IronPdf
執行範例 看您的HTML變成PDF。