我有一个用C ++开发的COM对象。此类使用另一个(第三方)COM对象,它抛出一个事件EvtThirdParty。这个第三方对象只是我班级的一种方法。
现在我正在使用.NET中的COM对象(Visual Basic用于它的价值)应用程序,我想从Visual Basic应用程序中捕获EvtThirdParty。
我猜这里没有简单的方法可以做到这一点,但是请在这里提供这些信息以防万一有人指出一个。所以,我在我的COM对象中添加了一个事件(EvtThirdPartyDummy),每当它捕获EvtThirdParty时,都会将一个EvtThirdPartyDummy引发到VB.NET。
到目前为止,非常好。
现在,当应用程序收到此事件时,它必须对我的对象进行几次调用,以获取一些信息。
这是我的问题开始的地方。我得到一个关于断开连接的上下文的奇怪消息:
检测到已断开连接的上下文
消息:上下文0x1b9351e0'是 断开。释放接口 从当前的背景(背景 0x1b934f90)。这可能会导致腐败 或数据丢失。为了避免这个问题, 请确保所有 上下文/公寓保持活力直到 应用程序完全完成 使用RuntimeCallableWrappers 表示生活的COM组件 他们内心。
我不是绝对肯定这是我得到的确切消息,因为我的Visual Studio 2005是西班牙语,我在Google中发现了这一点,但它似乎足够接近。存在一些差异(例如,我的消息的标题是“Visual Studio 2005”,IIRC,但这可能是由于不同的IDE版本)。
对于我在Google中发现的内容,似乎创建对象的线程已被破坏,但我很确定情况并非如此。它是在主应用程序线程中创建的。
如果我从事件处理程序中删除所有代码,那么一切都可以作为魅力。
我最好的猜测是我的活动是在一个全新的线程中处理的,但AFAIK不应该这样。
发生了什么事?
答案 0 :(得分:3)
这是来自托管调试助手的警告,文档are here。虽然它是一个警告,但如果它在事件回调期间发生,则不应该忽略它。它通常是一个线程问题,拥有COM对象的线程已经退出。或称为CoUnitialize()拆除其公寓。同样的事情,一个退出的线程调用CoUnitialize()。
你的问题几乎没有真正有助于为它提供一个像样的诊断。请考虑这个第三方COM组件可能与它有关的可能性,例如在另一个线程上引发事件。 Debug + Windows + Threads窗口应该有帮助。并注意Output窗口,它显示了线程终止通知。
答案 1 :(得分:2)
首先,这不是我的强项,但因为你还没有任何回应......
事件是在不同的线程上引发的,所以你所说的关于在另一个线程上的说法听起来很合理。您可以尝试在事件处理程序中调用Invoke()
以使主线程返回并在事件引发后检查您的对象。
它是什么类型的项目以及 主线程在做什么?
如果这可能是性能方面的问题(锁定UI / ???),那么让一个不同的线程包围该对象并等待被告知事件可能更有意义。然后在事件处理程序中,通知创建者线程它有工作要做。
正如我所说,我远非专家,所以也许其他人可以给你更好的答案。