【问题标题】:ReportAvOnComRelease Error with Marshal.Release()使用 Marshal.Release() 报告AvOnComRelease 错误
【发布时间】:2016-03-12 01:35:11
【问题描述】:

我在这里看到过类似的错误,但无法确定是什么原因造成的。

我有一个 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 或在相应的 RuntimeCallableWrapper 被垃圾回收后隐式释放 COM 接口指针时捕获但处理了异常。这是用户引用计数错误或 COM 对象的 Release 存在其他问题的结果。确保正确管理引用计数。虽然 CLR 会捕获这些类型的异常,但它们仍可能导致损坏和数据丢失,因此应尽可能解决导致异常的问题

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

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

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

【问题讨论】:

    标签: c# com marshalling


    【解决方案1】:

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

    Marshal.Release() 仅用于减少 COM 接口指针上的引用计数。不是窗把手。窗口的生命周期由用户或创建窗口的线程控制。所以千万不要试图“释放”GetForegroundWindow()的返回值。

    只需删除 Marshal.Release()。

    【讨论】:

    • 回想起来,这不是关于 COM 和元帅的初学者问题,但我真的很感激(我做到了,对于像我这样的傻瓜来说,这个答案实际上比你想象的要多得多问题第一)在你提出问题之前给我一记耳光。虽然你当时对我来说是个聪明人,但我今天很佩服你的耐心。
    猜你喜欢
    • 2018-02-27
    • 2013-01-21
    • 2010-12-02
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多