我对 C# marshal 的 COM 对象是否在线程之间感到非常困惑。为此,我有一个应用程序以任务并行方式加载一组文件。我正在使用StaTaskScehduler使用 COM 对象加载文件。加载 COM 对象后,我将该对象存储在中央列表中。
然后我稍后尝试对这些数据执行一些处理,再次使用 STATaskScheduler。然而,在这一点上,我遇到了一个问题。我收到如下异常:
An unhandled exception of type 'System.Runtime.InteropServices.InvalidComObjectException' occurred in MadCat.exe
Additional information: COM object that has been separated from its underlying RCW cannot be used
现在我的理解是我收到此错误是因为该对象尚未编组到新线程中。我认为这是 C# 为你做的事情?
如何在一个线程中创建一个单元线程 COM 对象,然后在另一个线程中使用它?
我在这里吠错树了吗?我什至不应该为我的线程使用 Sta 公寓吗?我可以保证该对象永远不会同时从多个线程访问。任何想法都非常感谢。
编辑:COM对象定义如下:
[
coclass,
threading( apartment ),
vi_progid( [Namespace.Class] ),
progid( [Namespace.Class].6 ),
version( 6.0 ),
uuid( GUID_C[Class] ),
helpstring( [Class]" Class" )
]
所以据我了解,这是一个单元线程对象,对吧?我刚刚尝试使用未设置公寓状态的修改后的任务调度程序(默认情况下为 MTA?)。当我在一个线程中创建它并从另一个线程使用它时,这个对象似乎确实有效。这是安全的还是会以其他方式回来咬我?
COM 的线程模型总是让我很困惑:/