1

当您将非托管句柄(存储在托管端的 IntPtr 或 SafeHandle 中)从托管代码传递到非托管代码以执行重叠 I/O 时,正确的方法是什么?

  • 使用 SafeHandle 将 (IntPtr) 操作系统句柄包装在其中,
  • 或使用 GCHandle.Alloc(IntPtrHandle, GCHandleType.Pinned) 固定它?

我目前正在将 SafeHandle 与 NativeOverlapped 结构结合使用,但我开始越来越怀疑 GC 在内存中移动一个或两个,而不受管理的重叠 IO 正在进行。

我会更好地回到使用 IntPtr 而不是 SafeHandle,并使用 GCHandle 结构来固定它吗?

或者正确的方法是所有的组合,即在你的 NativeOverlapped 中,使用 IntPtr 的固定版本,而 IntPtr 又来自 SafeHandle?

- 编辑

午饭时回想起来,我觉得我很愚蠢。它必须是需要固定的重叠结构,而不是其中的手柄。这是正确的(最佳)答案吗?

4

0 回答 0