如何在.NET中创建服务型组件
作者:张劲松 本文选自:赛迪网 2002年12月03日
对于在WINDOWS上作过一些开发的程序员来说,COM+应该是不会感到陌生的吧。COM+代表了Microsoft在COM技术平台上的最高水平,也是Microsoft藉以和J2EE抗衡的支点(J2EE里的核心思想其实也从COM+的前身MTS中借鉴了许多)。事实上,COM+确实是非常出色的产品,对于中等难度的项目,用VB6加COM+的确是一个非常快速高效的技术组合。更值得一提的是COM+是完全免费的。只要你拥有了WINDIWS 2000或是XP。
在.NET推出后,人们似乎忘记了COM+。但如果你留心一下Microsoft技术发展的动向,你就不难发现在今后一到两年内,COM+不会退出WINDOWS舞台。它的许多服务功能还是.NET在短时间内无法替代的。比如说,COM+提供的实例管理(Instance management),交易处理(Transactions),断开连接的异步队列组件(Disconnected asynchronous queued components),基于角色的安全机制(Role-based securiry)等等。所以在今后一段时间内将是新旧技术结合,COM逐渐向.NET过渡的情形。在这种大的技术背景下,学习如何用.NET来编写在COM+中运行的组件还是非常有意义的。
本文将结合一个小的例程向大家描述一下开发SERVICED COMPONENTS的基本流程、技术要点以及实际开发工作中应遵循的一些基本原则。
SERVICED COMPONENT简介
SERVICED COMPONENT是指用任何和.NET CLS相兼容的程序语言开发的类。它必须直接或间接的派生于System.EnterpriseService.ServicedComponent这一基类。这样开发的类可以在COM+的环境中运行,调用COM+的服务。在.NET开发环境里,可供调用的COM+服务有
· Automatic Transaction Processing )(自动交易处理)
· COM Transaction Integrator (COMTI) (COM交易集成)
· Compensating Resource Managers (CRMs) (补偿性资源管理者)
· Just-In-Time Activation(即时激活)
· Loosely Coupled Events(松散连接事件)
· Object Construction (对象创建)
· Object Pooling(对象循环)
· Queued Components(队列组件)
· Role-Based Security(基于角色的安全)
· Shared Properties(共享的属性)
· Synchronization (Activity) (同步)
· XA Interoperability (XA的互操作)
SERVICED COMPONENT的开发流程
创建类库文件(Class Libray)
如例程所示,用户编写的类它必须直接或间接的派生于ServicedComponent基类
//例程的文件名是Bank.cs using System.EnterpriseServices; using System.Runtime.CompilerServices; using System.Reflection; namespace BankComponent { //继承ServicedComponent public class Account : ServicedComponent { public bool transfer(int from_Account, int to_Account, double amount) { //银行转帐的实现细节,这里从略 return true; } } } |
生成钥匙文件(Key)
在COM+环境里运行的SERVICED COMPONENT必须是被签署的(有STRONG NAME),所以你开发的组件要用"钥匙"文件来签署。钥匙文件可以用.NET提供的工具sn.exe来生成。最简单的方法是从VISUAL STUDIO提供的COMMNAD PROMPT打开一个DOS窗口,执行如下命令:
你可以在源程序里加入COM+相关的属性,这些属性将反映到COM+的设置中。但这不是必须的。你可以不在程序里设置COM+相关的属性,而是等组件发布后,在COM+提供的"组件服务浏览器"里设置组件的属性。在你手工设置之前,COM+会给你的组件设以缺省值。 COM+可设置的属性非常多,这里仅用几个最常见的来示意一下。
发布组件 SERVICED COMPONENT发布是相对比较复杂的一步。本文不想就COM+注册的原理和细节展开讨论,只就最基本的两种发布方法做一介绍。要注意的一点是发布组件涉及到对COM+的目录(Catelog)进行改动,所以操作者必须有管理员的权限。 a. 动态发布
动态发布不需要手工将组件安装在COM+环境中,程序在运行的时候自动安装组件到COM+中去(只有用.NET开发的客户端程序才可以在运行时将组件安装到COM+中,传统的COM客户程序没有这一功能)。当管制客户端程序(Managed Client Application)第一次调用SERVICED COMPONENT时,.NET运行时会自动侦测到SERVICED COMPONENT还没有注册安装到COM+环境里,于是.NET运行时将根据该组件的属性将它注册安装到COM+中去,并响应客户程序的调用。以后客户程序再次调用该组件的函数时,已经安装的组件会直接响应调用。
在管制客户第一次调用SERVICED COMPONENT服务的时,.NET在幕后进行注册和属性设置,你会感到有非常明显的延迟。在笔者的计算机上(1.13GHZ SONY NOTEBOOK),这一过程要花费大约12秒。好在这一注册和安装过程只发生一次。
动态发布的好处就是非常的简单,用户只需要把编译好的组件(DLL ASSEMBLY)拷贝到客户端应用程序的目录下就可以了。.NET运行时会接管余下的事情。
b. 手工发布
手工发布比动态发布要麻烦一些,但你有更多的控制。另外动态发布要求客户端程序目录下有一份编译好的组件拷贝。如果计算机上有多个客户端程序的话,那就意味着该计算机上有多份同样组件的拷贝。除了冗余以外,将来的组件升级也会有一些潜在的问题。在这种情况下,你可能更愿意将组件放到"公共汇编缓冲池去(GAC)"。手工发布组件你需要.NET提供的公共汇编缓冲池工具Gacuti.exe和服务安装工具Regsvcs.exe。就文中给出的例程而言,你需要在DOS窗口中键入以下命令。
客户端程序的开发
用.NET开发的SERVICES COMPONENT可以被.NET的客户程序以及传统的COM客户程序所调用。下面给出两个小的例程来示范一下。
a. .NET客户程序
用.NET开发客户程序没有说明特别的。只需要引用开发好的组件就可以了。如果组件被安装到了"公共汇编缓冲池去(GAC)"中,那么客户端程序就不需要一份专用的拷贝了。
using BankComponent; using System; namespace BankComponentConsoleClient { class Client { public static int Main() { bool bo = false; int start = Environment.TickCount; Account act = new Account(); bo = act.transfer(123,234,50.0); int end = Environment.TickCount; Console.WriteLine(Peformance: " + (end-start)); return 0; } } } |
b. 用VB6开发的COM客户程序
在VB的集成开发环境里新建一个工程,在工程引用(Project Reference)中加入bank.tlb(当你在在运行Regsvcs.exe 时,类库文件(Type Library)会自动生成),然后可以加入如下程序
Private Sub Command1_Click() Dim obj As New Account Dim bool As Boolean bool = obj.transfer(123,234,50.0) MsgBox "The Result is " & bool End Sub |
使用SERVICED COMPONENT的注意事项
1. 考虑客户端程序
在开发SERVICED COMPONENT时,要注意什么样的客户程序会使用它。 因为COM客户程序和用.NET开发的客户程序对SERVICED COMPONENT有不同的要求。如果将来有基于COM的客户程序,那么要在开发组件中注意以下几点:
· 不要使用带参数的创建函数(Parameterized constructors)
· 不要使用静态函数 (Static function)
· 定义事件源接口(Event-source interfaces)
· 在用户定义的异常(User-defined Exceptions)中包含HRESULTs
2. 慎重使用SERVICED COMPONENT
在COM+环境中运行.NET开发的组件要通过COM->.NET中间层,并且COM到COM+还会引入一层CONTEXT LAYER. 这对程序的性能有很大的影响。你如果运行一下本文提供的小程序有就会有一些感性认识。另外,在理论上讲,使用SERVICED COMPONENT会影响程序的可移植性。因为COM+必尽是Microsoft专有的技术,其它平台如LINUX即使移植.NET,也不会移植这部分功能。所以只有在真正需要COM+提供的服务,比如跨数据源的交易处理,基于角色的安全管理的时候,再使用SERVICED COMPONENT这一技术。
SERVICED COMPONENT其它用法
本文仅是对如何开发SERVICED COMPONENT作了一个简单的介绍。全面掌握SERVICED COMPONENT还需要进一步的工作。笔者将在随后的文章中进一步介绍如队列组件(Queued Component),松散连接的事件(Loosely Couple Events)等等比较复杂的功能和用法。
如何在.NET中创建服务型组件相关推荐
- vue 递归创建菜单_如何在Vue中创建类似中等的突出显示菜单
vue 递归创建菜单 by Taha Shashtari 由Taha Shashtari 如何在Vue中创建类似中等的突出显示菜单 (How to Create a Medium-Like Highl ...
- 如何在React中从其父组件更改子组件的状态
by Johny Thomas 约翰尼·托马斯(Johny Thomas) 如何在React中从其父组件更改子组件的状态 (How to change the state of a child com ...
- 如何在React中使用功能组件
Have you wondered how to create a component in React? 您是否想过如何在React中创建组件? To answer, it is as simple ...
- 如何在Leangoo中创建企业
Leangoo介绍: Leangoo(中文名:领歌)是一款非常优秀的敏捷项目管理软件.Leangoo核心是看板,团队可以使用Leangoo看板进行项目或产品的需求.任务.问题.缺陷的可视化管理和协作, ...
- 如何在android中创建自定义对话框?
本文翻译自:How to create a Custom Dialog box in android? I want to create a custom dialog box like below ...
- 如何在Java中创建一个新的List
本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...
- html树状图右侧_如何在 Tableau 中创建控制图?
本文作者:Jose Valero 控制图是用于研究流程如何随时间变化,并确定制造或业务流程是否在统计控制状态下的图表. 我相信这对每家公司来说都是一个有益的工具,所以在这篇文章中,我将尝试如何在 Ta ...
- vb在服务器上新建文件夹,vb.net-如果不存在,如何在VB中创建文件夹?
vb.net-如果不存在,如何在VB中创建文件夹? 我为自己编写了一个小小的下载应用程序,以便我可以轻松地从服务器上获取一组文件,然后将它们全部放入带有全新安装的Windows的新PC上,而无需实际运 ...
- vj节点_创意编码—如何在JavaScript中创建VJ引擎
vj节点 by George Gally 通过乔治·加利 创意编码-如何在JavaScript中创建VJ引擎 (Creative Coding - How to create a VJ engine ...
最新文章
- Validator(二)自定义
- Spring Boot 启动加载数据 CommandLineRunner
- python2.7安装git_[Centos]安装Git2.7.0
- 驱动开发类文章公告篇
- SAP ABAP RFC table administration
- 定义命令别名(alias)
- 新人报道,写的东西还请大神们多指导!也希望能让和我一样的同事少走弯路。...
- ConvertFrom-String 命令研究
- 若依如何实现翻页保留选择?
- std::thread的常用参数传递总结
- Flink CDC 系列 - 同步 MySQL 分库分表,构建 Iceberg 实时数据湖
- 企业微信最全17种获客+4种自动转化玩法
- zoj 1101 Gamblers 为什么总是WA?
- 每一个梦想都要让它长上翅膀
- 宝岛探险(C语言 )(DFS+BFS)
- Oracle 19c VLDB and Partitioning Guide 第4章:分区管理 读书笔记
- Java 16 藏刀而来,Java 8 面不改色 | 它强任它强,我用 Java 8,嘿嘿
- Javaweb学习之中文乱码问题
- MySQL课程设计——简易学生信息管理系统
- cube escape语言设置_Cube Escape Harvey's Box攻略
热门文章
- 【radar】毫米波雷达相关资料(文献综述列表、顶会研讨会资料列表、顶会workshops资料列表、工具书、使用手册)(2)
- python嵌套循环执行顺序_两个嵌套for循环的执行顺序
- opencv python下载_[福利] OpenCV4 Python 最新中文版官方教程来了(附下载)
- 在Ubuntu 14.04 64bit上编译安装xbt tracker
- Rocksdb Slice使用中的一个小坑
- on-my-zsh git 仓库下运行卡顿
- Effective C++ 1.0 -- 概述
- # NVIDIA Jetson系列系统镜像备份烧录指南
- 小程序全局状态管理,在页面中获取globalData和使用globalSetData
- K8s简单yaml文件运行例子deployment