use*_*572 39 .net winapi interop
在没有指向MSDN的情况下,有人可以简明扼要地解释每个问题的目的以及何时使用它们.(IntPtr,SafeHandle和HandleRef)
Mic*_*urr 51
IntPtr 只是一个简单的基于整数的结构,可以保存一个指针(即,32位系统上的32位大小,64位系统上的64位大小).
SafeHandle是一个用于保存Win32对象句柄的类 - 它有一个终结器,用于确保在对象为GC时关闭句柄. SafeHandle是一个抽象类,因为不同的Win32句柄有不同的方式需要关闭.在引入之前SafeHandle,IntPtr用于保存Win32句柄,但确保它们被正确关闭并防止被GC控制是程序员的责任.
HandleRef是一种在P/Invoke调用过程中确保非托管句柄不是GC的方法.如果没有类似的东西HandleRef,如果P后您的托管代码没有与处理任何事情/ Invoke调用,如果GC是在P期间运行/ Invoke调用它不会意识到句柄仍在使用,可能GC它.我想(但我不确定并且没有看过)SafeHandle可能会HandleRef用作其封装句柄管理的一部分.
小智 18
HWnd a = new HWnd();
B.SendMessage(a.Handle, ...);
Run Code Online (Sandbox Code Playgroud)
假设这是程序中对"a"的唯一引用,这相当于:
HWnd a = new HWnd();
IntPtr h = a.Handle;
// a is no longer needed and thus can be GC'ed
B.SendMessage(h, ...);
Run Code Online (Sandbox Code Playgroud)
问题是,当"a"被丢弃时,它将关闭手柄.如果在调用SendMessage之前或期间发生这种情况,则句柄将无效.
HandleRef防止"a"在程序完成之前被垃圾收集.
| 归档时间: |
|
| 查看次数: |
17728 次 |
| 最近记录: |