调试时COM对象消失

时间:2010-09-13 09:37:01

标签: .net com

我不确定标题是否足够但这是我的问题:

我在.NET 4.0中编写了一个使用某些COM对象的应用程序。当我设置断点并检查我的代码太长时,当我尝试执行与COM相关的一行代码时,我得到一个异常。如果我相对快速地完成我的代码,一切都很好。

是否有一些开关来阻止这种情况?是什么导致了这种行为?

我得到的删除是InvalidCastException类型。

提前致谢

3 个答案:

答案 0 :(得分:1)

当COM接口的IUnknown :: QueryInterface()方法返回E_NOINTERFACE错误返回码时,会引发InvalidCastException。两个基本原因。通常的做法是COM对象根本不实现您要转换的接口。然而,这是非常可重复的,它不会受到调试会话的影响。

第二个原因比较棘手,与线程有关。当您在另一个线程中使用RCW时,CLR将自动封送接口指针。这要求COM服务器显式实现IMarshal接口,注册代理/存根DLL(从IDL构建)或支持标准编组器(使用类型库)。

这不是普遍的做法,有很多COM服务器只是假设它们只能在一个线程中使用。调试器因为它在Watch窗口中评估表达式的方式而发挥作用。它实际上运行代码来获取表达式的值。我知道的确切规则没有很好的记录,但有时代码将在辅助线程上运行。例如,如果您使用Debug + Break All进入程序则是典型的。如果COM服务器不支持编组,那么辅助线程将会爆炸。要检查的一件事是拥有COM对象的线程是当前线程。 Debug + Windows + Threads并双击拥有的线程(通常是应用程序的主线程)。

不是一个很好的解释,它不是你的观察的灌篮,但我怀疑这是接近问题。您无能为力,避免使用Watch窗口显示COM服务器属性。或者编写一些调试代码将服务器属性复制到局部变量中,改为将Watch放在该变量上。

答案 1 :(得分:0)

这些物体是远程的还是本地的?如果是远程的,也许你的断点正在触发RPC超时。

答案 2 :(得分:0)

您确定COM对象上的引用计数是否正确。否则,操作系统会看到COM对象不再被引用,从而将其从内存中释放出来。