传递给非托管代码的句柄是否需要固定?
Does a handle passed to unmanaged code need to be pinned?
我有一个需要调用的非托管函数,它接受一个等待句柄作为参数。非托管代码在适当的时候向这个等待句柄发出信号,以通知我的代码某些情况。我的问题是,我是否需要以某种方式固定此等待句柄以防止 GC 移动等待句柄?
(伪)代码如下:
using (var resetEvent = new AutoResetEvent(false))
{
var iBuffer = Convert.ToUInt32(resetEvent.SafeWaitHandle.DangerousGetHandle().ToInt32());
// Pass iBuffer to unmanaged API function. The unmanaged API passes in the wait handle as a ref uint.
var handles = new[] {resetEvent, _cancellationTokenSource.Token.WaitHandle};
while(WaitHandle.WaitAny(handles) == 0)
{
// do stuff in response to resetEvent being signaled.
}
}
我没有直接传递 AutoResetEvent 对象(甚至 'SafeWaitHandle' ),但实际上返回了 DangerousGetHandle() 。我不清楚返回的 'Dangerous' 句柄是否真的代表非托管资源,因此不需要任何固定?
据我所知,没有。
需要固定以防止移动托管内存。另一方面,句柄代表一些操作系统资源,因此不需要固定。
您可能仍需要注意句柄未被非托管代码保存,并确保句柄在非托管代码使用时不是release/invalidate/close/dispose。
我有一个需要调用的非托管函数,它接受一个等待句柄作为参数。非托管代码在适当的时候向这个等待句柄发出信号,以通知我的代码某些情况。我的问题是,我是否需要以某种方式固定此等待句柄以防止 GC 移动等待句柄?
(伪)代码如下:
using (var resetEvent = new AutoResetEvent(false))
{
var iBuffer = Convert.ToUInt32(resetEvent.SafeWaitHandle.DangerousGetHandle().ToInt32());
// Pass iBuffer to unmanaged API function. The unmanaged API passes in the wait handle as a ref uint.
var handles = new[] {resetEvent, _cancellationTokenSource.Token.WaitHandle};
while(WaitHandle.WaitAny(handles) == 0)
{
// do stuff in response to resetEvent being signaled.
}
}
我没有直接传递 AutoResetEvent 对象(甚至 'SafeWaitHandle' ),但实际上返回了 DangerousGetHandle() 。我不清楚返回的 'Dangerous' 句柄是否真的代表非托管资源,因此不需要任何固定?
据我所知,没有。
需要固定以防止移动托管内存。另一方面,句柄代表一些操作系统资源,因此不需要固定。
您可能仍需要注意句柄未被非托管代码保存,并确保句柄在非托管代码使用时不是release/invalidate/close/dispose。