上下文激活

在 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::Deactivate,可以将激活和停用挂钩在一起,以在新上下文中执行特殊初始化。 将对象配置为使用 JIT 激活或对象池时,COM+ 在对象的生命周期中的特定点调用这些方法。 有关更多详细信息,请参阅 COM+ 实时激活COM+ 对象池

拦截跨上下文调用