我在这里看到过类似的错误,但无法确定导致错误的原因。
我有一个引用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捕获了这些类型的异常,但它们仍然可能导致损坏和数据丢失,因此如果可能的话,应解决导致异常的问题
对我而言,这表明存在内存泄漏或指针损坏的可能性非常高。
我似乎无法确定原因,但从极其简单明了的用例中可以看出。
有关如何调试和/或解决此问题的任何建议?
答案 0 :(得分:2)
你对COM的概念很模糊。你没有使用任何,这是普通的pinvoke。 MDA正确地告诉你,你所做的事情没有任何意义。
Marshal.Release()仅用于减少COM接口指针上的引用计数。不是窗户把手。窗口的生命周期由用户或创建窗口的线程控制。所以你不能试图"发布" GetForegroundWindow()的返回值。
只需删除Marshal.Release()。