使用COM关闭WPF应用程序时的RaceOnRCWCleanup和“启用非托管代码调试”

时间:2011-03-08 22:26:28

标签: .net wpf debugging com unmanaged

在我的WPF应用程序开发过程中,在调试时关闭应用程序时,我突然得到了看似非常可怕的RaceOnRCWCleanup。在没有附带调试器的情况下执行时,一切正常。

警告信息的图片和文字:

enter image description here

  

托管调试助手   'RaceOnRCWCleanup'检测到了   问题   'MyEXE'。附加信息:   已经尝试释放一个   RCW正在使用中。 RCW正在使用中   在活动线程或另一个   线。试图释放使用中   RCW可能导致损坏或数据丢失。

堆栈跟踪不是很有帮助:

   [External Code] 
>   mscoreei.dll!000007fef75c3309()     
    [Frames below may be incorrect and/or missing, no symbols loaded for mscoreei.dll]  
    mscoree.dll!000007fef7655b21()  
    kernel32.dll!0000000077b7f56d()     
    ntdll.dll!0000000077cb2cc1()    

由于我在第一次出现错误之前所做的最后一次更大的改变是使用了我的托管C#代码中的COM对象,我显然怀疑是OCX(由我编写)。搜索网络和stackoverflow没有产生任何解决方案。

然后我发现只有当“启用非托管代码调试”设置被激活时才会发生。我已经这样做了,因为我也想调试用非托管C ++编写的OCX。禁用非托管代码调试会立即消除问题。

这发生在Windows 7,没有SP1的Visual Studio 2010上。

有没有人解释这里发生了什么?这是一个错误吗?

更新:当我为Visual Studio 2010安装Service Pack 1时,此问题已消失。

1 个答案:

答案 0 :(得分:1)

没多大意义。但是,如果您提前终止调试会话,请忽略此警告。它是由MDA注意到一个线程结束,它有一个未被编组的未完成的COM接口调用。使用Debug + Stop调试肯定可以触发此警告,它会终止线程。