【发布时间】:2011-02-22 03:21:25
【问题描述】:
我是一名新的 C# 程序员,并创建了一个应用程序,该应用程序使用第 3 方 COM 对象来跟踪来自通话记录服务器的电话通话记录。 COM软件的创建者也是制作通话录音软件的供应商,所以你会认为它应该可以工作。我与他们的员工进行了许多电话和代码审查,但他们提供的帮助很少。
应用程序响应来自 COM 对象的事件,如 OnCallStart 和 OnCallEnd、AgentLogon、AgentLogoff、ServerDown 等。我只是监视事件返回的内容并将其写入文件。该应用程序编译没有问题并运行了几分钟,然后它给了我以下错误(我必须在 Debug>Exceptions 菜单中打开 Exception 才能最终看到它):
检测到 ReportAvOnComRelease
消息:在通过 Marshal.Release 或 Marshal.ReleaseComObject 或在相应的 RuntimeCallableWrapper 被垃圾回收后隐式释放 COM 接口指针时捕获但处理了异常。这是用户引用计数错误或 COM 对象的 Release 存在其他问题的结果。确保正确管理引用计数。 COM 接口指针的原始 vtable 指针是 0x45ecbac。虽然 CLR 会捕获这些类型的异常,但它们仍可能导致损坏和数据丢失,因此应尽可能解决导致异常的问题。
它给我的仅此而已。没有 vtable 详细信息、引用计数或其他任何内容。我编写了一个 GC.Collect() 并让应用程序运行了一分钟,然后触发了 GC.Collect 并得到了错误。我可以在一定程度上做到这一点。我已经阅读了一篇又一篇关于这个错误和正确编组的文章,但我不是唯一的编组。 VS 为 COM 对象创建了一个 RCW,我使用它,所以我在那里没有控制权,还是我?除了理论上的闲聊之外,没有一篇文章给我任何代码示例或任何其他内容。
有没有更好的方法来做到这一点?我怎样才能找到导致错误的确切原因?似乎没有办法隔离这件事。我从微软的一个人那里找到一篇文章,称其为“沉默的刺客”,但他没有给出任何解决方案,并且基本上承认 MS 也没有任何解决方案。 Read Here
我束手无策。任何帮助表示赞赏。
【问题讨论】:
标签: c# com marshalling com-interop