在过去的几天里,我读了一些关于COM和互操作性的很好的文章。 但是有两个说法让我有些困惑。
microsoft interop documentation说:
导出的托管服务器,其类型库已由 Regasm.exe(程序集注册工具)具有ThreadingModel注册表 条目设置为两者。该值表示服务器可以 在单线程单元(STA)或多线程中激活 公寓(MTA)。服务器对象与 其调用方,如下表所示。
在microsoft threading documentation中,我发现:
暴露给COM的托管对象的行为就像 聚合了自由线程封送处理程序。换句话说,它们可以是 从任意COM公寓以自由线程方式调用。唯一的 没有这种自由线程行为的托管对象是 从ServicedComponent派生的那些对象,或者 StandardOleMarshalObject。
...
当非托管线程通过(例如) COM可调用包装器,系统检查该线程的本地存储 线程以查找内部托管线程对象。如果找到一个 运行时已经知道此线程。如果找不到一个 但是,运行时会构建一个新的Thread对象并将其安装在 该线程的线程本地存储。
也许我不明白好像他们聚合了自由线程封送处理程序的意思。 但这是否意味着在STA中创建.NET对象时,它仍然像具有Threading Model 'Free' 的对象一样工作吗?
以我的理解,大致而言,以上所有引用均表示以下含义: 不管调用线程的公寓类型(STA,MTA)如何,.NET对象都可以创建多个线程,因为它由CLR管理,因此不必遵循COM线程模型规则。
或更简单:在我的托管.NET库中,即使调用进程是单线程VB6应用程序,我也可以创建任意数量的线程。
这是正确的吗?