다음을 통해 공유


HandleRef 구조체

플랫폼 호출을 사용하여 비관리 코드에 전달된 리소스 핸들을 보유하고 있는 관리되는 개체를 래핑합니다.

네임스페이스: System.Runtime.InteropServices
어셈블리: mscorlib(mscorlib.dll)

구문

‘선언
<ComVisibleAttribute(True)> _
Public Structure HandleRef
‘사용 방법
Dim instance As HandleRef
[ComVisibleAttribute(true)] 
public struct HandleRef
[ComVisibleAttribute(true)] 
public value class HandleRef
/** @attribute ComVisibleAttribute(true) */ 
public final class HandleRef extends ValueType
JScript에서는 구조체를 사용할 수 있지만 새로 선언할 수는 없습니다.

설명

플랫폼 호출을 사용하여 관리되는 개체를 호출했는데 플랫폼 호출 이후 해당 개체가 참조되지 않으면 가비지 수집기에서 관리되는 개체가 종료될 수 있습니다. 이 동작은 리소스를 해제하고, 핸들을 무효로 만들고, 플랫폼 호출이 실패하도록 합니다. HandleRef로 핸들을 래핑하면 플랫폼 호출이 종료될 때까지 가비지 수집기가 관리되는 개체를 수집하지 않습니다. 플랫폼 호출 서비스에 대한 자세한 내용은 관리되지 않는 DLL 함수 사용을 참조하십시오.

GCHandle과 같은 HandleRef 값 형식은 interop 마샬러가 인식하는 특수한 형식입니다. 고정되지 않은 일반 GCHandle도 적절하지 않은 가비지 수집이 일어나지 않도록 하지만 HandleRef를 사용하면 성능이 향상됩니다. HandleRef를 사용하여 플랫폼 호출이 완료될 때까지 개체가 활성 상태를 유지하도록 하는 것이 좋지만 GC.KeepAlive 메서드를 사용할 수도 있습니다.

HandleRef 생성자는 두 개의 매개 변수를 사용합니다. 하나는 래퍼를 나타내는 Object이고, 다른 하나는 관리되지 않는 핸들을 나타내는 IntPtr입니다. interop 마샬러는 비관리 코드에만 핸들을 전달하므로 첫 번째 매개 변수로 HandleRef 생성자에 전달된 래퍼는 호출이 완료될 때까지 활성 상태를 유지합니다.

예제

다음 예제에서는 HandleRef를 사용하여 첫 번째 매개 변수로 전달된 개체의 활성 상태를 유지하는 방법을 보여 줍니다. interop 마샬러는 비관리 코드에만 핸들을 전달합니다.

Dim fs As New FileStream("HandleRef.txt", FileMode.Open)
Dim hr As New HandleRef(fs, fs.SafeFileHandle.DangerousGetHandle())
Dim buffer As New StringBuilder(5)
Dim read As Integer = 0

' platform invoke will hold reference to HandleRef until call ends

LibWrap.ReadFile(hr, buffer, 5, read, 0)
Console.WriteLine("Read with struct parameter: {0}", buffer)
FileStream fs = new FileStream("HandleRef.txt", FileMode.Open);
HandleRef hr = new HandleRef(fs, fs.SafeFileHandle.DangerousGetHandle());
StringBuilder buffer = new StringBuilder(5);
int read = 0;

// platform invoke will hold reference to HandleRef until call ends

LibWrap.ReadFile(hr, buffer, 5, out read, 0);
Console.WriteLine("Read with struct parameter: {0}", buffer);
FileStream^ fs = gcnew FileStream( "HandleRef.txt", FileMode::Open );
HandleRef hr = HandleRef(fs,fs->Handle);
StringBuilder^ buffer = gcnew StringBuilder( 5 );
int read = 0;

// platform invoke will hold reference to HandleRef until call ends
LibWrap::ReadFile( hr, buffer, 5,  &read, 0 );
Console::WriteLine( "Read with struct parameter: {0}", buffer );

스레드로부터의 안전성

이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

플랫폼

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

참고 항목

참조

HandleRef 멤버
System.Runtime.InteropServices 네임스페이스
GCHandle 구조체