, (IntPtr void*) ( Windows). , IntPtr, .
SafeHandle . , , ( - ). , CreateFile HANDLE, SafeFileHandle. SafeHandle Windows, Windows, SafeHandle. , SafeHandle , .
- . . IntPtr - struct, struct (.. , IntPtr , IntPtr)). , GC IntPtr s.
HandleRef :
HandleRef : a Object, , IntPtr, . interop , ( HandleRef) .
MSDN:
FileStream fs = new FileStream("HandleRef.txt", FileMode.Open);
HandleRef hr = new HandleRef(fs, fs.SafeFileHandle.DangerousGetHandle());
StringBuilder buffer = new StringBuilder(5);
int read = 0;
LibWrap.ReadFile(hr, buffer, 5, out read, 0);
Console.WriteLine("Read with struct parameter: {0}", buffer);
LibWrap.ReadFile2(hr, buffer, 5, out read, null);
Console.WriteLine("Read with class parameter: {0}", buffer);
:
FileStream fs = new FileStream("HandleRef.txt", FileMode.Open);
var hf = fs.SafeFileHandle.DangerousGetHandle();
StringBuilder buffer = new StringBuilder(5);
int read = 0;
LibWrap.ReadFile(hf, buffer, 5, out read, 0);
Console.WriteLine("Read with struct parameter: {0}", buffer);
LibWrap.ReadFile2(hf, buffer, 5, out read, null);
Console.WriteLine("Read with class parameter: {0}", buffer);
GC.KeepAlive(fs);
:
using(FileStream fs = new FileStream("HandleRef.txt", FileMode.Open))
{
StringBuilder buffer = new StringBuilder(5);
int read = 0;
LibWrap.ReadFile(fs.SafeFileHandle, buffer, 5, out read, 0);
Console.WriteLine("Read with struct parameter: {0}", buffer);
LibWrap.ReadFile2(fs.SafeFileHandle, buffer, 5, out read, null);
Console.WriteLine("Read with class parameter: {0}", buffer);
}
:
SafeHandle , , , GC , ( Dispose()).
, , . fixed GCHandle.
IntPtr struct, , GC.
IntPtr, , HWnd, , GC. , .
:
HWnd a = new HWnd();
IntPtr h = a.Handle;
B.SendMessage(h, ...);
, , . IntPtr h = a.Handle; a, , . GC.KeepAlive(a) , ( , JIT, ).
SafeHandle , HandleRef. ?
. , P/Invoke , (,
HWnd) , . ,
HandleRef,
SafeHandle. , (
HWnd ) .
HandleRef IntPtr, . SafeHandle IntPtr . , P/Invoke.