上下文激活

在 COM+中,每个 COM 对象都是使用关联的上下文创建的。 这意味着必须创建和初始化新上下文,或者使用适当的现有上下文。 此过程称为 激活。 在 COM+中,对象在其自己的上下文或创建者上下文中激活(已请求激活对象的对象,例如,通过调用 CoCreateInstance)。

在某些情况下,例如,使用 对象池激活对象,无需从头开始创建对象。 在这种情况下,在上下文中激活正在运行的实例。 在其生存期内,它可能会在不同的上下文中重复激活。

在任一情况下,基本机制都是相同的— 对象与上下文相关联,并且该上下文已正确初始化以表示对象的运行时需求。

上下文属性的流动

在响应另一个对象的创建请求时激活对象时,COM+ 需要调解它们才能正确激活下游对象。 COM+ 必须将调用方上下文与所调用组件的配置进行比较,然后决定在何处激活下游组件以及如何初始化其上下文属性。

为了发现组件的配置,COM+ 在 COM+ 类注册数据库中查找它,该数据库针对极快的运行时查找进行优化。 (这是由将组件安装到 COM+ 应用程序时配置组件的方式决定的。然后,根据调用方上下文属性的状态检查组件的配置。

在某些情况下,配置与调用方上下文一致,组件可以在调用方上下文中激活。 仅当调用方上下文满足新对象的所有运行时要求时,才会发生这种情况。

如果无法在调用方上下文中激活下游组件,则会在相应的单元中在其自己的上下文中激活该组件。 发生这种情况时,某些上下文属性可能会从调用方流向被调用方。 例如,如果调用方与事务关联并且被调用方支持事务,则新对象将获取其自己的上下文(要在事务中投票,它需要有自己的一致标志),并继承调用方的事务 ID 和活动 ID(驻留在同一事务和同步域中)。

忽略的上下文属性

根据组件的配置方式,某些上下文属性在确定是否在创建者的上下文或自己的上下文中激活它时可能没有作用。 例如,“事务已禁用”和“同步禁用”设置(指示事务或同步域的存在)在组件的激活中不会扮演任何角色。 当上下文流动时,这些属性基本上将被忽略。 或者,如果组件仅使用进程级访问检查,则忽略其安全上下文属性 - 组件的安全配置永远不会在其激活中扮演角色。

强制在调用方上下文中激活

在某些情况下,你可能希望仅在其调用方上下文中激活对象,也就是说,从未在其自己的上下文中激活。 例如,在跨上下文边界调用对象时,可能需要控制该对象的行为。

可以使用组件服务管理工具 在组件 属性 页的 激活 选项卡上选择“必须在调用方上下文”选项中激活对象,以确保对象不能在其自己的上下文中激活。 (有关分步说明,请参阅调用方上下文 中的 强制激活。选择此选项时,如果无法在调用方上下文中激活对象,CoCreateInstance 失败,则返回CO_E_ATTEMPT_TO_CREATE_OUTSIDE_CLIENT_CONTEXT。

默认上下文

默认上下文存在以支持未配置的组件,即 COM+ 应用程序中未安装 COM 组件,且未在 COM+ 类注册数据库中注册。 如果未配置的组件具有兼容的线程模型,则会在调用者的上下文中激活它们。 否则,它们将激活在相应单元的默认上下文中。 每个单元都有一个默认上下文来支持不使用 COM+ 服务的 COM 对象。

挂钩激活

通过实现 IObjectControl::ActivateIObjectControl::D eactivate,可以将激活和停用挂钩在一起,在新上下文中执行特殊初始化。 当对象配置为使用 JIT 激活或对象池时,COM+ 在对象的生命周期中的特定点调用这些方法。 有关详细信息,请参阅 COM+ 实时激活COM+ 对象池

跨上下文调用的截获