System.Runtime.InteropServices. 금고Handle 클래스

이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.

이 클래스는 SafeHandle 핸들 리소스의 중요한 종료를 제공하여 핸들이 가비지 수집에 의해 조기에 회수되는 것을 방지하고 운영 체제에서 의도하지 않은 관리되지 않는 개체를 참조하도록 재활용하는 것을 방지합니다.

금고 이유는 무엇인가요?

메서드를 재정의하면 Object.Finalize 개체가 가비지 수집될 때 관리되지 않는 리소스를 클린 수 있지만, 경우에 따라 플랫폼 호출 내에서 메서드를 실행하는 동안 가비지 수집을 통해 종료 가능한 개체를 회수할 수 있습니다. 종료자가 해당 플랫폼 호출 호출에 전달된 핸들을 해제하면 손상이 발생할 수 있습니다. 파일을 읽는 동안과 같이 플랫폼 호출 중에 메서드가 차단되는 동안 핸들을 회수할 수도 있습니다.

더 중요한 것은 Windows가 핸들을 적극적으로 재활용하기 때문에 핸들을 재활용하고 중요한 데이터를 포함할 수 있는 다른 리소스를 가리킬 수 있다는 점입니다. 이를 재활용 공격이라고 하며 잠재적으로 데이터가 손상되고 보안 위협이 될 수 있습니다.

금고Handle이 수행하는 기능

클래스는 SafeHandle 이러한 개체 수명 문제 중 몇 가지를 간소화하고 운영 체제 리소스가 유출되지 않도록 플랫폼 호출과 통합됩니다. 클래스는 SafeHandle 중단 없이 핸들을 할당하고 해제하여 개체 수명 문제를 해결합니다. 플랫폼 호출 호출이 손상된 상태로 간주되는 경우에도 핸들이 닫히고 예기치 않은 AppDomain 언로드 중에 실행되도록 보장하는 중요한 종료자가 포함됩니다.

SafeHandle 상속되므로 CriticalFinalizerObject모든 중요하지 않은 종료자가 중요한 종료자 앞에 호출됩니다. 종료자는 동일한 가비지 수집 패스 중에 더 이상 라이브가 되지 않는 개체에 대해 호출됩니다. 예를 들어 개체는 FileStream 일반 종료자를 실행하여 핸들이 유출되거나 재활용될 위험 없이 기존 버퍼링된 데이터를 플러시할 수 있습니다. 중요 종료자와 중요하지 않은 종료자 간의 매우 약한 순서는 일반적인 용도로 사용되지 않습니다. 이는 주로 해당 라이브러리가 의미 체계를 변경하지 않고 사용할 SafeHandle 수 있도록 하여 기존 라이브러리의 마이그레이션을 지원하기 위해 존재합니다. 또한 중요 종료자 및 메서드와 같이 호출하는 모든 항목은 SafeHandle.ReleaseHandle() 제한된 실행 영역에 있어야 합니다. 이렇게 하면 종료자의 호출 그래프 내에서 작성할 수 있는 코드에 제약 조건이 적용됩니다.

플랫폼 호출 작업은 a로 캡슐화된 SafeHandle 핸들의 참조 수를 자동으로 증가시키고 완료 시 감소합니다. 이렇게 하면 핸들이 예기치 않게 재활용되거나 닫힙니다.

클래스 생성자의 인수에 값을 제공하여 개체를 SafeHandle 생성할 때 기본 핸들의 ownsHandle 소유권을 SafeHandle 지정할 수 있습니다. 개체가 삭제된 후 개체가 핸들을 해제할지 여부를 SafeHandle 제어합니다. 이는 특이한 수명 요구 사항이 있는 핸들 또는 다른 사람이 수명을 제어하는 핸들을 사용하는 데 유용합니다.

금고Handle에서 파생된 클래스

SafeHandle 는 운영 체제 핸들에 대한 추상 래퍼 클래스입니다. 이 클래스에서 파생하는 것은 어렵습니다. 대신 다음을 위해 안전한 핸들을 Microsoft.Win32.SafeHandles 제공하는 네임스페이스에서 파생 클래스를 사용합니다.