ReportAvOnComRelease与Marshal.Release()

时间:2016-03-11 17:19:58

标签: c# com marshalling

我在这里看到过类似的错误,但无法确定导致错误的原因。

我有一个引用IntPtr对象的GetForegroundWindow()

IntPtr ptr = GetForegroundWindow();

GetForegroundWindow()方法如下:

[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();

这又用于建立GetExecutablePath()方法:

string name = GetExecutablePath(ptr);

在这段时间之后,我打电话给臭名昭着的Marshal.Release()

Marshal.Release(ptr);

此时我收到以下错误:

  

托管调试助手'ReportAvOnComRelease'已检测到

更多信息包括:

  

附加信息:在通过Marshal.Release,Marshal.ReleaseComObject释放COM接口指针或在相应的RuntimeCallableWrapper被垃圾收集后隐式地处理了异常。这是用户引用计数错误或COM对象发布的其他问题的结果。确保正确管理refcounts。虽然CLR捕获了这些类型的异常,但它们仍然可能导致损坏和数据丢失,因此如果可能的话,应解决导致异常的问题

对我而言,这表明存在内存泄漏或指针损坏的可能性非常高。

我似乎无法确定原因,但从极其简单明了的用例中可以看出。

有关如何调试和/或解决此问题的任何建议?

1 个答案:

答案 0 :(得分:2)

你对COM的概念很模糊。你没有使用任何,这是普通的pinvoke。 MDA正确地告诉你,你所做的事情没有任何意义。

Marshal.Release()仅用于减少COM接口指针上的引用计数。不是窗户把手。窗口的生命周期由用户或创建窗口的线程控制。所以你不能试图"发布" GetForegroundWindow()的返回值。

只需删除Marshal.Release()。