【问题标题】:Does .net interop do cross-thread marshalling for COM or do I need to use CoMarshalInterThreadInterfaceInStream or similar?.net interop 是否为 COM 进行跨线程编组,还是我需要使用 CoMarshalInterThreadInterfaceInStream 或类似的?
【发布时间】:2009-05-27 18:24:20
【问题描述】:
谁能给我一个明确的答案,我是否需要使用 CoMarshalInterThreadInterfaceInStream、CoGetInterfaceAndReleaseStream 或 GlobalInterfaceTable 之类的东西来编组线程之间的 COM 接口?在this thread 中,有人说互操作为您完成,有人说您需要使用这些调用。是哪个?
具体来说,我在 IE 中开发浏览器帮助对象时使用了来自 mshtml 的各种 IHTMLxxx 对象。我从未使用过像 CoMarshalInterThreadInterfaceInStream 这样的方法,也从未意识到这会导致任何问题。但也许这可能是一些间歇性不可重复问题的原因......
谢谢。
【问题讨论】:
标签:
.net
interop
marshalling
【解决方案1】:
根据经验,如果您的 dll 在 IE 中作为 BHO 加载,那么您不需要进行任何跨线程编组。似乎 .NET 自己完成了所有的魔法。
您应该做的是确保您只使用 STA 线程来访问 MSHTML 对象。从 IE 事件进入 BHO 的任何线程都将自动成为 STA 线程,但如果您有其他线程(例如后台计时器),那么您应该在访问 IE 对象之前确保它们是 STA,否则会发生坏事。