实现客户端
当一个基于CLR 组件服务类被编译和部署,你就需要在客户端调用它。长远来看,组件服务类没什么特别之处;事实是使用COM+ 运行时服务是不相关的。 这个代码展示了简单类早期的定义MyTxCfgClass:
using ESExample;
public class Client
{
public static void Main(string[] args)
{
MyTxCfgClass tcc = new MyTxCfgClass();
... // use object as desired
}
}
当然,与所有的CLR代码,客户端必须引用组件服务类程序集。
csc /r:ESExample.dll Client.cs
细微的复杂性
这里你会看到,服务类通过 .NET CLR实现COM+是相当的容易。 System.EnterpriseServices 命名空间里的类提供了可以使用COM+运行时服务的API。运行时服务本身没什么改变;他们工作的方式还是 COM+开发者熟知的。已经说了, 集成COM+和CLR 没有涉及到如此细微的复杂性。 有几个问题是使得使用CLR语言写 COM+ 代码比我刚才提到的复杂的多。 有些问题会产生,因为CLR毕竟不是 COM, 因为它可以做COM做不到的事情。这些问题是不能解决的; 你只要知道如何CLR的特性如静态方法和垃圾回收器 如何影响COM+ 编程。
再学习这些问题前,你必须知道CLR 的类和 and COM+ 上下文环境的关系。 首先,调用继承自ServicedComponent的类的实例都会被COM+ 上下文环境边界侦听。这些对象称为上下文环境边界。调用没继承自ServicedComponent的类的实例就不会被上下文环境边界侦听。 这些对象称为context-agile。CLR对象默认就是context-agile。 当你继承自ServicedComponent它们会变成context-bound 。(这个与 .NET remoting 上下文环境没有关系,我下面会讲到。) 图 9说明的这个架构
再学习这些问题前,你必须知道CLR 的类和 and COM+ 上下文环境的关系。 首先,调用继承自ServicedComponent的类的实例都会被COM+ 上下文环境边界侦听。这些对象称为上下文环境边界。调用没继承自ServicedComponent的类的实例就不会被上下文环境边界侦听。 这些对象称为context-agile。CLR对象默认就是context-agile。 当你继承自ServicedComponent它们会变成context-bound 。(这个与 .NET remoting 上下文环境没有关系,我下面会讲到。) 图 9说明的这个架构
图 9 上下文环境对象
非常有趣的是CLR 对象可以实现类似COM 对象和COM+ 上下文环境交互这样的行为。通过 COM,调用对象通常默认都会被侦听; 所有的对象都是context-bound。COM 对象是context-agile 只有当它聚集了freethreaded marshaler (FTM)且不是第一个在COM+ 上下文环境里 被创建的对象(因为它不是可识别的对象), 这样情况下,调用不会被侦听。 新方法确保调用真的需要的时候被预处理和迟处理的好处是减少了侦听负荷。 特别地,如果组件服务类的实例返回了一个非组件服务类的实例 (例如一个 ADO.NET DataSet 对象),这个调用不会被侦听。 并且DataSet对象不需要做任何事情,它就是照常工作。
第二个你应该知道的事情是, 除了减少真正需要的交叉上下文侦听外, CLR/COM+集成尽可能地避免了托管类型和自有类型间的转换。 来自托管的CLR 代码到COM的调用是比较昂贵的。重要的部分就是类型的前后转换—大部分在CLR strings和COM BSTRs之间。 请求穿过COM+环境边界需要 调用一些固有的代码, 组件已经相当聪明可以避免同样来自CLR且处在同一进程里的调用者和被调用者之间的类型转换。 或许有一天所有的COM+ 运行时服务都会用CLR语言重新实现,调转就不成问题了。 那时不管如何,这个优化都会使得COM+ 侦听更加快速。
静态方法和属性
现在你知道了CLR代码如何关联上下文环境, 思考这个问题:如果一个基于CLR 组件服务类 包括静态方法和属性访问器, 它将在什么上下文里执行呢?答案是调用者。 这个看起来不是很直观, 但是它确实很有意义当你想静态成员不是对象定义且不许要在对象驻留的上下文里访问。例如,组件服务类在图 10有个静态方法,2, 和静态属性,4。这个代码会在调用者的上下文里执行。 调用实例的方法1, 或者属性3,通常在对象的上下文里执行。
这时你或许想知道当你在属性里保存了一个对象的静态引用且你想在另外一个上下问里引用会发生什么事情。基于COM的COM+编程里, 在被成为静态属性的全局变量里保存了一个原始的对象引用, 会导致严重的错误因为你不可以把对象不加包装地从原来的上下文里带走。使用基于CLR COM+ 代码, 这个就不是一个问题。 CLR 使用相当瘦的代理包装了每个组件服务类的实例子这样其它上下问的对象就不需要保留对象的直接引用。如果代码在一个保留基于CLR 组件服务类引用在静态属性的的上下文执行。它实际保留的是一个引用。如果另一个上下文里的代码要通过静态属性访问它, 特定的代理就发现变化而且封装它自己保留的引用这样侦听就触发了。这个是有个优美的解决方案,本质上你可以任何地方保存基于CLR服务类的实例并且都会正确触发。
| ||
相关文章:
Windows XP: Make Your Components More Robust with COM+ 1.5 Innovations House of COM: Migrating Native Code to the.NET CLR the "samples"technologies"component服务 subdirectory of the.NET Framework SDK 事务al COM+: Building 可伸缩的应用系统 by Tim Ewald (Addison-Wesley, 2001) | ||
作者Tim Ewald: DevelopMento的首席科学家, 最近出版的 事务性COM+: 创建可伸缩的应用系统 (Addison-Wesley, 2001)的作者
|
来自10月 2001的 MSDN杂志
本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/321005,如需转载请自行联系原作者