【问题标题】:Does a handle passed to unmanaged code need to be pinned?传递给非托管代码的句柄是否需要固定?
【发布时间】:2020-06-02 15:16:29
【问题描述】:

我有一个需要调用的非托管函数,它接受一个等待句柄作为参数。非托管代码在适当时向这个等待句柄发出信号,以通知我的代码某些情况。我的问题是,我是否需要以某种方式固定此等待句柄以防止 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()。我不清楚返回的“危险”句柄是否真的代表非托管资源,因此不需要任何固定?

【问题讨论】:

    标签: c# .net pinvoke


    【解决方案1】:

    据我所知,没有。

    需要固定以防止托管内存被移动。另一方面,句柄代表一些操作系统资源,因此不需要固定。

    您可能仍然需要注意句柄没有被非托管代码保存,并确保句柄在被非托管代码使用时不会释放/无效/关闭/处置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      相关资源
      最近更新 更多