如何在.NET中创建服务型组件
对于在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是指用任何和.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的互操作)
创建类库文件(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+环境中,程序在运行的时候自动安装组件到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 |
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还需要进一步的工作。笔者将在随后的文章中进一步介绍如队列组件(Queued Component),松散连接的事件(Loosely Couple Events)等等比较复杂的功能和用法。
相关文章:

flex viewstack的简单应用
1 Flex API里面介绍viewstack: MX ViewStack 导航器容器由一组彼此上下堆叠的子容器组成,其中一次只可以显示一个子容器。选择另一个子容器后,它将显示在原来子容器的位置处,所以看起来好像此子容器替换了原来的子容器。…
在线等:“实习拿到两个不太好的offer,去腾讯还是去阿里?”
“你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬”了。1疫情下,有的公司宣布破产有的公司增长413%疫情期间,人工智能的价值…

如何成功地在亚洲植入敏捷和DevOps
\关键要点\\首先要植入西方文化的要素。\\t使用价值流映射有助于打破文化障碍。\\t让上层管理者参与进来。\\t黑客节(Hackfest)将有助于减少前置期时间。\\t理解文化差异的影响。\\\我读过的一篇文章说Scrum并不适合于亚洲。作者所说的非常正确ÿ…

浅析.Net下的AppDomain编程
作者:宋华 发文时间:2002 我们知道,进程是操作系统用于隔离众多正在运行的应用程序的机制。在.Net之前,每一个应用程序被加载到单独的进程中,并为该进程指定私有的虚拟内存。进程不能直接访问物理内存&…
AI 医生正式上岗了?AI 医疗结合迎爆发点!
作者 | 硬核云顶宫责编 | 晋兆雨封图 | CSDN 付费下载自视觉中国这些年,人工智能应用于医学界是非常热的话题。在医学三大杂志——新英格兰医学杂志、柳叶刀、JAMA上,AI与医疗相结合的论文,占比越来越高。其中最明显的趋势是将医生从繁重的诊…

Android之解析Android Map地图返回的Json数据
先上一下需要解析的Json数据:{"results" : [{"address_components" : [{"long_name" : "荔湾区","short_name" : "荔湾区","types" : [ "sublocality", "political" ]}…

9成P2P平台面临出局,千亿资本何去何从?
【阅读原文】作者:楠沨据研究院数据中心统计,截至2016年10月底,我国 P2P贷款余额已经攀升至7,470亿元左右,环比增长6.0%。进入10月份百强榜的平台,其贷款余额总计3,275亿元,占到整个行业的44%;榜…
关于Transformer,那些的你不知道的事
作者 | 小莫来源 | 阿泽的学习笔记(ID: aze_learning)引言本博客主要是本人在学习 Transformer 时的「所遇、所思、所解」,通过以 「十六连弹」 的方式帮助大家更好的理解该问题。十六连弹为什么要有 Transformer?Transformer 作用是什么&am…

用ASP.NET上传大文件
作者:思归 微软MVP http://blog.joycode.com/saucer/我们在上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题,因为ASP.NET会block直到把整个文件载入内存后,再加以处理。实际上,如果…

中国最齐全的主要电子商务网站(B2C)
中国最齐全的主要电子商务网站(B2C)------[连载之电子商务网站架构]访问量超过100万的电子商务网站技术架构版本:V1出处:http://jimmyli.blog.51cto.com/ 我站在巨人肩膀上Jimmy Li作者:Jimmy Li关键词:中国 电子商务 网站 B2C连接…

怎么安装MYSQL5.0的JDBC驱动
1、下载mysql for jdbc driver. http://dev.mysql.com/downloads/connector/j/3.1.htmlMySQL Connector/J is distributed as a .zip or .tar.gz archive containing the sources and class files as well as a class-file only "binary" .jar archive named "…

ASP.NET中的事务处理和异常处理
刘彦青编译 来自:yesky 使用SQL-Transaction类和.NET提供的异常处理机制,我们就能够以一种可靠的方式处理数据库运行中的问题和发现系统异常。这篇小文章将解释事务处理和异常处理的概念和用法。 什么是事务? 事务处理是由以一个单一的…
2020年AI产业报告:100个岗位抢1个人,计算机视觉成最大缺口
“你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬”了。1疫情下,有的公司宣布破产有的公司增长413%疫情期间,人工智能的价值…

.NET Winform也能画出类似QQ、飞信这样的窗口风格和控件效果
MPN企业宝智能升级程序界面采用.NET的Winform技术,并没有延续企业宝主程序的绘制界面技术——WPF。直接采用Winform实现类似QQ和飞信的窗口风格比较困难,WPF好在还有一个Blend设计工具,而Winform只能靠自己一个一个像素去对齐、去仔细看&…

【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别
转自:http://blog.csdn.net/paincupid/article/details/47746341 一、HashMap和TreeMap区别 1.HashMap是基于散列表实现的,时间复杂度平均能达到O(1)。 TreeMap基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均…

ASP.NET实现数据图表
作者:马金虎 来自:yesky 在ASP中插入图表,常用的方法是使用MSChart控件。那么在ASP.NET是否也是这样呢?答案是不可以的。 我们知道ASP.NET是一种编译语言,当客户端第一次调用ASP.NET页面的时候,其实是经过了一种…

Struts2基础(1)_MVC
2019独角兽企业重金招聘Python工程师标准>>> Struts2是有传统的Struts1和WebWork两个经典MVC框架发展起来,无论从Struts2的设计角度或则实际项目中的易用性来开,它都是一个非常优秀的MVC框架。 MVC的理解:MVC思想将应用中各组件按…
我发现了个Python黑魔法,执行任意代码都会自动念上一段「平安经」
来源 | Python编程时光最近的"平安经"可谓是引起了不小的风波啊。作为一个正儿八经的程序员,最害怕的就是自己的代码上线出现各种各样的 BUG。为此,明哥今天分享一个 Python 的黑魔法,教你如何在你执行任意 Python 代码前ÿ…

Java第一天学习笔记整理
一、关键字 java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名。 常见的关键字: 用于定义数据类型的关键字 class interface byte short int lon…

ASP.NET中树形图的实现
来自:DotNET中文技术网 树形图用于显示按照树形结构进行组织的数据,其用途比较广泛,如计算机中的文件系统(Windows中的资源管理器)、企业或公司的组成结构等。我们知道在Windows下VB、PB、Delphi等工具提供了一个功能很强的树型控件TreeView…

同步你的手机联系人
从web1.0到2.0,我们进入了一个新的互联网时代移动时代.相信你的手机中,有许多联系人信息,你肯定不想把他们弄丢吧,像我之前隔一段时间就备份下,存到电脑中.现在再也不怕联系人信息丢了,只需要一个账户,同步一下,所有联系人信息都回来了.我是在Android智能手机上操作的,IOS就不清…
AI 技术发展飞快,高校 AI 教师的知识储备能满足学生旺盛的求知欲吗?
2019 年,AI 技术以惊人的速度发展;2020 年,AI 技术成熟的时机已经到来,随之而来的,是越来越旺盛的 AI 人才需求。近日,国家正式发布了一份《2020 年人工智能产业人才发展报告》显示,2020 年人工…

Windows Server 2008 R2安装子域控制器
一、实验网络拓扑图: 二、实验说明: 子域控制器安装前需要先把主域控制器安装好,然后子域控制器的DNS先指向主域控制器的IP地址 192.168.10.30,主域控制器委派DNS给子域控制器后再把子域控制器DNS指向自己的IP地址 192.168.10.31即…

使用嵌套的Repeater控件显示分级数据
作者:wincheer 来自:Asp.Net中文专业网 简介 本文描述如何使用嵌套的Repeater 控件来显示分级数据 。当然了,你也可以将这一技术应用到其他的列表绑定控件上去,比如DataGrid包含DataGrid,DataList包含DataList等等…
我还没考试,算法就说我的物理一定挂科
来源 | HyperAI超神经责编 | Carol封图 | CSDN 下载自视觉中国大学物理是理工科学生的基础必修课程,但也因为有一定的难度,令很多学生望而生畏。研究人员提出了用 AI 算法预测,哪些学生物理课有挂科风险,好让老师更好地进行教学指…

Dorado7功能及技术特点
简介 Dorado PresentationMiddleware(即Dorado展现中间件,以下简称Dorado)致力于辅助Web应用中表现层的开发过程。Dorado主要可以为您带来如下两方面的使用价值: 更加美观、更加人性化的Web操作界面。更加高效的表现层开发…

ELK日志分析平台搭建全过程
一、使用背景 当生产环境有很多服务器、很多业务模块的日志需要每时每刻查看时 二、环境 系统:centos 6.5 JDK:1.8 Elasticsearch-5.0.0 Logstash-5.0.0 kibana-5.0.0 三、安装 1、安装JDK 下载JDK:http://www.oracle.com/technetwork/java/j…

Android中Handler
本文通过例子来验证和说明使用Handler对象开启的线程是否和主线程为在同一线程中。 程序结构图如下: [1] HandlerActivity.java中的源码如下: [html] view plaincopyprint?package com.andyidea.handlerdemo2; import android.app.Activity; import…
刚出炉!程序员人才补贴:单项目最高补贴1000万元
最近,程序员届有一个重大好消息,可能很多人还不知道,那就是:国内某些城市已经开始程序员人才补贴了!对于人工智能公司的项目开发、人才引进、科技研发,最高按照国拨经费的30%给予配套支持,单个项…

ASP.NET中在线用户统计
天极论坛 统计在线用户的作用不言而喻,就是为了网站管理者可以知道当前用户的多少,然后根据用户数量来观察服务器或者程序的性能,从而可以直观的了解到网站的吸引力或者网站程序的效率。现在,我们就介绍一个简单明了的方法来统计…