Thread Durumu Yok Edildikten Sonra Yönetilen Kod .NET 9 ve .NET 10
.NET 9.0.5 ve sonrasında ( .NET 10 dahil) IronPDF kullanan bir uygulama, ölümcül bir doğrulama hatası ve çıkış kodu 127 ile çıkış yapar.
Attempt to execute managed code after the .NET runtime thread state has been destroyed.
Microsoft, .NET 9.0.5'te daha katı FLS (Fiber Local Storage) thread temizliği tanıttı. İşletim sistemi FLS geri çağırma yürütme sıralamasını kontrol eder; bu da IronPDF'nin Chrome renderlayıcısı kendi kapanış dizisini tamamlamadan önce CLR sökümünü tetikleyebilir. Bu sorun Windows'a özgüdür; Linux ve macOS etkilenmez. .NET 6, 7 ve 8 temiz bir şekilde çıkar. IronPDF'nin PDF oluşturulması, doğrulama başlamadan önce başarıyla tamamlanır. Microsoft, sorunu "Gelecek" olarak dosyalamış olup planlı bir düzeltme tarihi yoktur.
Seçenekler
Seçenek 1: .NET 8'e Düşürme (Önerilen)
.NET 6.0.36 ve .NET 8.0.26 temiz bir şekilde çıkar. Temiz bir işlem çıkışı gerekiyorsa hedef framework'ü düşürün.
Seçenek 2: CI/CD'de çıkış kodları yerine test sonucu dosyalarını kullanın
Doğrulama başlamadan önce PDF işi başarıyla tamamlanır. Çıkış koduna güvenmek yerine sonuç dosyalarından test sonuçları yayınlayın:
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
Seçenek 3: Shell'de çıkış kodunu filtreleyin
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
Bilinen çalışmayan önlemler: Installation.SkipShutdown = true, SetErrorMode, Environment.Exit(0) ve çıkıştan önce manuel GC toplama.

