C# 中的非托管句柄,我需要释放还是销毁?

Unmanaged handle in C#, do I need to release or destroy?

我有一些 C# 代码通过 ComInterop 在 win32 应用程序中使用,它作为 OleControl 嵌入。

在我的 win32 应用程序中,我通过句柄发送到包含 window 的 C# 控件(win32 应用程序代码):

oControl:ShowPreview(5, 3, INT(_CAST, SELF:Handle(0)))

在我的 C# 代码中,我选择了它并将其存储在 IntPtr(C# 代码)中:

private IntPtr _parentWindowPtr;

public int ShowPreview(int someVar1, int someVar2, int parent)
{
    ...
    _parentWindowPtr = new IntPtr(parent);
    ...
}

我应该释放还是销毁 C# 代码中的 IntPtr?


这是我上面评论的总结


Should I be releasing or destroying the IntPtr in the C# code?

很简单,在处理 Ole/COM 时,您应该 而不是 释放 window 个句柄。 Ole Controls/COM ActiveX 可以被认为是更高级别的 UI 抽象(涉及 IOleControlIOleControlSite 协议),高于 windows。您释放 COM 引用 而不是释放 window 句柄,这最终导致 window 被销毁并释放句柄。

在您的特定情况下,您将本机 window 的句柄传递给您的 COM 控件以将其自身嵌入其中。最佳做法是调用进程(本机 exe)拥有包含 window 的所有权,因此 COM 控件不应自行破坏容器。

如何在 c# 中释放 COM 对象

提醒一下,在 C# 中释放 COM 对象的最佳做法是:

Marshal.ReleaseComObject(someComObject);

嵌入到 Microsoft Word 中的 Excel 图表不会自行关闭 Word。

告诉我更多