.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.
Microsoftは.NET 9.0.5でより厳格なFLS(ファイバーローカルストレージ)スレッドクリーンアップを導入しました。OSはFLSコールバック実行の順序を制御しますが、これはIronPDFのChromeレンダラーが終了シーケンスを完了する前にCLRのクリーンアップを引き起こす可能性があります。 この問題はWindows固有です。 LinuxおよびmacOSは影響を受けません。 .NET 6、7、8は正常に終了します。 IronPDFのPDF生成はアサーションが発生する前に正常に完了します。 Microsoftはこれを"未来"として登録しており、計画された修正予定日はありません。
オプション
オプション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:シェルで出口コードをフィルター
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コレクション。

