我正在尝试解决“无法使用已与其底层 RCW 分离的 COM 对象”错误的问题,我认为导致它的原因是 COM 对象在未实例化它们的线程上使用。
我不允许进行太多重构,并且由于对象应该在多个线程上可用,我想知道是否有一种方法可以在对它们进行可能导致上述错误的操作之前找出它们是否已在当前线程上创建。并且,如果他们没有,创建它们。
另外,我是这个互操作的新手,所以如果有人能帮助我理解,我将不胜感激:
线程完成后 COM 对象会发生什么情况,为什么 RCW 在另一个线程上仍然可用,即使它不再包含 COM 对象(为什么它不为空?)。此外,为什么它会导致该错误并同时在 Marshal.IsCOMObject 上返回 true?
在以下使用引用计数、包装器和内存的情况下会发生什么:
- 在线程 A 上创建 COM 对象 x
- 传递它并保存在线程 B 上
- 在线程 C 上创建另一个 x(或者,如果它是 y 会发生什么?)
- 传递它并覆盖线程 B 上的 x