c# - 如何从托管代码中调试未发布的 COM 引用?

标签 c# .net debugging com clr

我一直在寻找一种工具来调试未发布的 COM 引用,这通常会导致例如如果代码未正确调用所有 COM 实例上的 Marshal.ReleaseCOMObject,Word/Outlook 进程将卡在内存中。 (Outlook 2007 部分修复了 outlook 插件,但这是一个一般性问题)。

是否有一种工具可以至少显示托管代码持有的 COM 引用列表(按类型)?理想情况下,它还可以显示内存分析器样式的对象树,以帮助调试发生引用增量。

在运行时进行调试并不像能够附加到挂起的进程那么重要 - 因为问题通常发生在使用 COM 接口(interface)完成代码并且有人忘记释放某些东西时 - 应用程序(例如 winword)在内存中挂起即使在调用托管应用程序退出之后。

如果不存在这样的工具,(技术?)原因是什么?这对于调试许多在使用 COM 互操作时很难发现的问题非常有用。

最佳答案

不完全是您正在寻找的答案(或简单到),但 ReleaseCOMObject(与它包装的 native Release 一样)返回一个 Integer,它应该指示剩余的未完成引用的数量。您可以将代码添加到您的项目以显式执行 AddRef,这样您就可以发布,并查看新的计数,看看它是否符合您的预期,等等。

关于c# - 如何从托管代码中调试未发布的 COM 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2400143/

相关文章:

c# - 为什么 C# 允许通过接口(interface)扩展方法而不是类进行多重继承?

c# - 如何将变量保存到新的文本文件,以便下次运行程序时加载这些变量?

c# - CollectionBase 类是否仍然受支持?

c# - WPF 数据绑定(bind) : Nullable Int still gets a validation error?

c# - 异步填充强类型数据集

c++ - C程序到C++ B+树

javascript - Heroku 上的 Meteor 应用程序 sockjs 连接已关闭

c# - .NET 的 HTML 到 PDF 转换器

c# - 独立调试窗口?

c# - 如何确保异常 "The calling thread cannot access this object because a different thread owns it"?