TL;DR - 总是元帅......总是。
为什么?然后 COM 知道这件事并会做正确的事......
...我真的需要编组其对象接口以将其传递给同一进程中的另一个线程吗?
是的。总是。
这里的 COM 规则是,访问 COM 对象必须始终在创建它时在同一个单元中完成(对于 STA,在同一个线程上读取)。如果你颠覆它(即使它看起来有效),你可能会遇到COM 调用之间出现死锁,因为不同公寓中的对象相互等待。
如果 COM 看到元帅的源和目标公寓是 MTA,它不会强加任何开销。它还将能够根据需要管理对其他公寓的回调。
...如果一个 COM 类是线程安全的,那就是它被标记为 Both 或 Free...
这意味着该对象可以用于任何一种公寓类型。正是在创造的时候,决定了它将居住的公寓。
根据我的经验,它运行良好,我的问题是,这是否只是时间问题、危险并因任何原因导致崩溃,还是完全安全且拥有规则很好?
颠覆 COM 线程模型通常会让人泪流满面——可能在最初的罪行发生数年后才平静下来。这是一颗定时炸弹。不要这样做。
如评论中所述,有CoCreateFreeThreadedMarshaler
,但如链接文档中的评论所述,它需要“......计算出违反 COM 规则......”,并且确实暗示了非一般或窄带的适用性。