스레드 상태가 파괴된 후 .NET 9 및 .NET 10에서 관리 코드
IronPDF를 사용하는 애플리케이션이 .NET 9.0.5 및 이후 버전(.NET 10 포함)에서 치명적인 단언 오류와 종료 코드 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
알려진 작동하지 않는 완화책: Installation.SkipShutdown = true, SetErrorMode, Environment.Exit(0), 그리고 종료 전 수동 GC 수집.

