Verwalteter Code nach Thread-Zustandszerstörung in .NET 9 und .NET 10

This article was translated from English: Does it need improvement?
Translated
View the article in English

Auf .NET 9.0.5 und später (einschließlich .NET 10) beendet eine Anwendung, die IronPDF verwendet, mit einem schwerwiegenden Assertion Error und Exit-Code 127.

Attempt to execute managed code after the .NET runtime thread state has been destroyed.

Microsoft hat strengere FLS (Fiber Local Storage) Thread-Bereinigung in .NET 9.0.5 eingeführt. Das Betriebssystem steuert die Reihenfolge der FLS-Callback-Ausführung, die den CLR-Abriss auslösen kann, bevor IronPDF's Chrome-Renderer seine eigene Abschaltsequenz abschließt. Dieses Problem ist Windows-spezifisch; Linux und macOS sind nicht betroffen. .NET 6, 7 und 8 beenden sauber. IronPDF's PDF-Generierung wird erfolgreich abgeschlossen, bevor der Assertion-Fehler auftritt. Microsoft hat das Problem als "Future" erfasst, ohne geplantem Fixdatum.

Optionen

Option 1: Downgrade zu .NET 8 (Empfohlen)

.NET 6.0.36 und .NET 8.0.26 beenden sauber. Downgraden Sie das Ziel-Framework, wenn ein sauberer Prozessabschluss erforderlich ist.

Option 2: Verwenden Sie Testergebnisdateien anstelle von Exit-Codes im CI/CD

Die PDF-Arbeit wird erfolgreich abgeschlossen, bevor der Assertion-Fehler auftritt. Veröffentlichen Sie Testergebnisse aus Ergebnisdateien anstatt sich auf Exit-Codes zu verlassen:

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

Option 3: Exit-Code im Shell filtern

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

Bekannte nicht funktionierende Abhilfen: Installation.SkipShutdown = true, SetErrorMode, Environment.Exit(0) und manuelle GC-Sammlung vor dem Beenden.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 20,088,359 | Version: 2026.7 gerade veröffentlicht
Still Scrolling Icon

Scrollst du immer noch?

Sie brauchen schnell einen Beweis? PM > Install-Package IronPdf
Führen Sie eine Probe aus Sehen Sie zu, wie Ihr HTML-Code in eine PDF-Datei umgewandelt wird.