2011-04-05 35 views
1

我试图解决“COM对象已经从其基础RCW分离不能使用”的错误,并且我认为是什么导致它是COM对象在没有实例化它们的线程上使用。COM对象是否与RCW分开?

我不允许做太多的重构,因为对象应该在多个线程上可用我不知道是否有一种方法来查明它们是否在当前线程上创建之前,错误。如果他们没有,创建它们。

而且,我是新来这个互操作的事情,所以如果有人能好心帮助我明白,我会非常感激:

与COM对象,一旦线程结束会发生什么,以及为什么RCW在另一个线程上仍然可用,即使它没有COM对象(为什么它不是空的?)。另外,为什么它会导致这个错误,并在Marshal.IsCOMObject上同时返回true?

在以下情况下(S)与引用计数和包装和存储会发生什么:

  • 创建的线程上COM对象x一个
  • 它传递并保存在线程B
  • 在线程C-创建另一个X(或者,如果分别为:y会发生什么?)
  • 它传递和线程B上覆盖X

回答

4

一旦线程完成

COM对象得到由COM自动销毁与COM对象会发生什么。当另一个线程继续使用它时,将产生'已分离的COM对象'异常消息。您不能允许该线程退出。

显然你有一个单线程的COM服务器,迄今为止最常见的一种。它与创建它的STA线程有亲和力。 COM确保将另一个线程上的任何调用自动封送到创建该对象的线程。当线程消失时,这不再有效。另外要注意,你没有得到任何并发性。

另一种获取此异常的方法是通过使用Marshal.ReleaseComObject()明确处理引用计数的错误。因为您应该收到MDA警告,所以不可能。

+0

Marshal.ReleaseComObject()s遍布整个地方,但这次不会导致它。通过在程序的初始化阶段初始化主线程上的COM对象来解决问题。感谢您的意见,我需要确保它们可以在其他线程中使用,而无需在其中创建它们。但是,在将您标记为已接受之前,我想等待更完整的答案,因为我仍然不明白一些提到的东西.. – Damir 2011-04-05 13:57:01

相关问题