c# - COM 对象是否已与其 RCW 分离?

标签 c# com interop rcw

我正在尝试解决“无法使用已与其底层 RCW 分离的 COM 对象”错误的问题,我认为导致该问题的原因是 COM 对象在未实例化它们的线程上使用。

我不允许进行太多重构,并且由于对象应该在多个线程上可用,我想知道是否有一种方法可以在对它们进行可能导致上述错误的操作之前查明它们是否已在当前线程上创建。如果还没有,请创建它们。

另外,我对互操作这件事还很陌生,所以如果有人愿意帮助我理解,我将非常感激:

一旦线程完成,COM 对象会发生什么,为什么 RCW 在另一个线程上仍然可用,即使它不再有 COM 对象(为什么它不为空?)。另外,为什么它会导致该错误并同时在 Marshal.IsCOMObject 上返回 true?

在以下使用引用计数、包装器和内存的场景中会发生什么:

  • 在线程A上创建COM对象x
  • 传递并保存到线程B
  • 在线程 C 上创建另一个 x(或者,如果是 y 会发生什么?)
  • 传递它并覆盖线程 B 上的 x

最佳答案

What happens with the COM object once the thread finishes

COM 对象会被 COM 自动销毁。当另一个线程继续使用它时,将产生“COM 对象已分离”异常消息。您不能允许线程退出。

显然,您有一个单线程 COM 服务器,这是迄今为止最常见的类型。它与创建它的 STA 线程具有亲和性。 COM 确保自动将在另一个线程上进行的任何调用编码(marshal)到创建该对象的线程。当线程消失时,它就不再起作用了。另请注意,您不会获得任何并发性。

获得此异常的另一种方法是错误地使用 Marshal.ReleaseComObject() 显式处理引用计数。也不是不可能,因为您应该收到 MDA 警告。

关于c# - COM 对象是否已与其 RCW 分离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5551253/

相关文章:

c - 以编程方式管理 FreeBSD Jails

c++ - 为什么 wchar_t* 的第一个字符在传递给 WinRT 组件时被删除?

c# - .NET NetworkStream读取速度慢

c++ - 如何使用 OLE-DB 访问 COM/C++ ATL 应用程序中的 dbf 文件?

visual-c++ - 如何向我的 C# 应用程序公开 C++ 方法?

c++ - 使用 WinAPI (Windows Core Audio) 时避免无效指针

winapi - Direct3D 中的 COM 对象

c# - 运行需要 "Security Message"的命令行 (cmd)

c# - Linq-OrderByDescending 对我不起作用-ASP.net MVC

c# - 在 ASP.NET MVC Controller 之间共享代码