【问题标题】:Which Apartment is a COM Callable Wrapper associated with?COM Callable Wrapper 与哪个 Apartment 相关联?
【发布时间】:2012-10-09 17:04:05
【问题描述】:

我已经阅读了很多关于 COM 公寓和 .NET 互操作的信息,但我还没有找到这个问题的答案。这让我相信我可能问错了问题。

我知道 .NET 线程(如本机线程)既可以是 MTA 也可以是 STA,我找到了这方面的文档,但我很少看到关于对象及其 CCW 如何与这些单元关联的信息。

我的猜测是 CCW 的线程模型是“Both”,并且 CCW 与创建线程所属的单元相关联。

CCW 与哪个公寓相关联,我能否控制这种行为?

【问题讨论】:

    标签: .net com com-interop


    【解决方案1】:

    .NET 实现的 COM 对象通常可以存在于任何类型的 COM 单元中。默认情况下,用于将 .NET 程序集注册为 COM 服务器的 .NET 方法/工具将使用线程模型 = Both 注册 coclass。

    如果您想将 .NET 类公开为具有不同线程模型的 COM coclass(例如强制进入 STA),那么您需要提供customised registration function

    【讨论】:

    • 我明白了,但是没有被 CoCreateInstance 实例化的对象呢?例如,如果 COM 客户端调用 x.CreateWidget 并且该方法的实现返回一个新的 .NET 对象。返回的 Widget 的 CCW 会不会继承 x 的 CCW 的单元?
    • 这是一个非常好的问题。在默认情况下(线程模型=Both),答案是显而易见的——正常的 COM 规则会将新对象放置在其创建者 (x) 的单元中。但是,我不知道在创建新的 COM 包装器以返回到非托管客户端时 Interop 层是否尊重自定义注册:例如,如果 x 是 Both 而 Widget 注册为单元线程(反之亦然)。你可以试试看。
    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多