我一直在寻找一种工具来调试未发布的 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/