Código Gestionado Después de Destrucción del Estado de Hilo en .NET 9 y .NET 10
En .NET 9.0.5 y posteriores (incluyendo .NET 10), una aplicación que usa IronPDF sale con un error fatal de aserción y código de salida 127.
Attempt to execute managed code after the .NET runtime thread state has been destroyed.
Microsoft introdujo una limpieza de hilos FLS (Fiber Local Storage) más estricta en .NET 9.0.5. El sistema operativo controla el orden de ejecución de las devoluciones de llamada FLS, lo que puede desencadenar la destrucción del CLR antes de que el renderizador Chrome de IronPDF termine su secuencia de apagado. Este problema es específico de Windows; Linux y macOS no se ven afectados. .NET 6, 7 y 8 salen sin problemas. La generación de PDF de IronPDF se completa correctamente antes de que se active la afirmación. Microsoft ha catalogado el problema como "Futuro" sin una fecha de solución planificada.
Opciones
Opción 1: Degradar a .NET 8 (Recomendado)
.NET 6.0.36 y .NET 8.0.26 finalizan limpiamente. Degradar el marco de trabajo objetivo si se requiere una finalización limpia del proceso.
Opción 2: Utilizar archivos de resultados de prueba en lugar de códigos de salida en CI/CD
El trabajo de PDF se completa correctamente antes de que se active la afirmación. Publica los resultados de prueba a partir de los archivos de resultados en lugar de depender del código de salida:
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
Opción 3: Filtrar el código de salida en el 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
Soluciones conocidas que no funcionan: Installation.SkipShutdown = true, SetErrorMode, Environment.Exit(0), y recolección manual de GC antes de salir.

