이 문서는 이 API에 대한 참조 설명서를 보충하는 추가 설명을 제공합니다.
이 SafeHandle 클래스는 핸들 리소스의 중요한 종료를 제공하여 가비지 수집으로 인한 핸들의 조기 회수를 방지하고, 운영 체제가 의도하지 않은 비관리 개체를 참조하도록 재활용되는 것을 방지합니다.
SafeHandle인 이유
메서드를 재정의하면 Object.Finalize 개체가 가비지 수집될 때 관리되지 않는 리소스를 정리할 수 있지만, 경우에 따라 플랫폼 호출 내에서 메서드를 실행하는 동안 가비지 수집을 통해 종료 가능한 개체를 회수할 수 있습니다. 종료자가 그 플랫폼 호출에 전달된 핸들을 해제하면 핸들 손상이 발생할 수 있습니다. 플랫폼 호출(예: 파일을 읽는 동안) 중에 메서드가 차단될 때도 핸들을 회수할 수 있습니다.
더 중요한 것은, Windows가 핸들을 적극적으로 재활용하기 때문에, 재활용된 핸들이 중요한 데이터를 포함할 수 있는 다른 리소스를 가리킬 가능성이 있다는 점입니다. 이를 재활용 공격이라고 하며 잠재적으로 데이터가 손상되고 보안 위협이 될 수 있습니다.
SafeHandle이 수행하는 기능
클래스는 SafeHandle 이러한 개체 수명 문제 중 몇 가지를 간소화하고 운영 체제 리소스가 유출되지 않도록 플랫폼 호출과 통합됩니다. 클래스는 SafeHandle 중단 없이 핸들을 할당하고 해제하여 개체 수명 문제를 해결합니다. 플랫폼 호출이 손상된 상태로 간주되는 경우에도, 예기치 않은 AppDomain 언로드 동안 실행되도록 보장하며 핸들을 닫는 중요한 파이널라이저가 포함되어 있습니다.
SafeHandle가 CriticalFinalizerObject를 상속받기 때문에, 모든 중요하지 않은 파이널라이저가 중요한 파이널라이저보다 먼저 호출됩니다. 종료자는 동일한 가비지 수집 패스 중에 더 이상 작동하지 않는 개체에 대해 호출됩니다. 예를 들어 개체는 FileStream 일반 종료자를 실행하여 핸들이 유출되거나 재활용될 위험 없이 기존 버퍼링된 데이터를 플러시할 수 있습니다. 중요한 종료자와 중요하지 않은 종료자 사이의 매우 약한 순서는 일반적인 용도로 의도된 것이 아닙니다. 이는 주로 해당 라이브러리가 의미 체계를 변경하지 않고 사용할 SafeHandle 수 있도록 하여 기존 라이브러리의 마이그레이션을 지원하기 위해 존재합니다. 또한 중요한 파이널라이저 및 SafeHandle.ReleaseHandle() 메서드와 같이 호출하는 모든 항목은 제한된 실행 영역에 있어야 합니다. 이렇게 하면 종료자의 호출 그래프 내에서 작성할 수 있는 코드에 제약 조건이 적용됩니다.
플랫폼 호출 작업은 a로 캡슐화된 SafeHandle 핸들의 참조 수를 자동으로 증가시키고 완료 시 감소합니다. 이렇게 하면 핸들이 재활용되거나 예기치 않게 닫히지 않도록 보장합니다.
클래스 생성자의 SafeHandle 인수에 값을 제공하여 기본 핸들의 ownsHandle
소유권을 설정하고 SafeHandle 개체를 생성할 수 있습니다.
SafeHandle는 개체가 삭제된 후 핸들을 해제할지를 제어합니다. 이는 특이한 수명 요구 사항이 있는 핸들 또는 다른 사람이 수명을 제어하는 핸들을 사용하는 데 유용합니다.
SafeHandle에서 파생된 클래스
SafeHandle 는 운영 체제 핸들에 대한 추상 래퍼 클래스입니다. 이 클래스에서 파생하는 것은 어렵습니다. 그 대신, 다음 항목에 대해 안전한 핸들을 제공하는 Microsoft.Win32.SafeHandles 네임스페이스의 파생 클래스를 사용합니다.
- 파일(SafeFileHandle 클래스)
- 메모리 매핑된 파일( SafeMemoryMappedFileHandle 클래스).
- 파이프( SafePipeHandle 클래스).
- 메모리 뷰( SafeMemoryMappedViewHandle 클래스).
- 암호화 구문( SafeNCryptHandle, SafeNCryptKeyHandle, SafeNCryptProviderHandle및 SafeNCryptSecretHandle 클래스).
- 프로세스( SafeProcessHandle 클래스).
- 레지스트리 키( SafeRegistryHandle 클래스).
- 대기 핸들 (SafeWaitHandle 클래스).
.NET