COM+有几种不同用途的类型:
1、应用程序代理:包含应用程序注册信息的文件,即当有客户访问远程计算机的服务器程序时,运行在客户端的应用程序代理就会将服务器应用程序的信息写入客户端器计算机中。
2、服务器应用程序:即在COM+应用程序本身的进程内执行COM+应用程序,同时使用并发性来处理组件。
3、库应用程序:是在客户应用程序的进程内执行的,装载在客户应用程序进程内的,使用基于任务的安全性,缺点是不支持远程访问和队列组件。
4、COM+预安装应用程序:到管理工具中的组件服务中的COM+应用程序文件夹中查看就明白什么是COM+预安装应用程序了,它是在COM+安装过程中自动安装进组件服务的应用程序,不能修改也不能删除。
同时涉及到一个叫“程序集(Assembly )”的概念:它是CLR所有类型和其它资源(如位图文件等)的集合。可通过管理工具下的“配置.NET框架”来查看。包括有私有和共享的程序集。私有程序集:它只能被放在与该程序集相同路径的应用程序访问。默认为私有,必须放在使用它的应用程序的文件夹中。共享程序集:指添加在GAC(Global Assembly Cache)中的程序集。GAC是专门用来存放程序集中,使应用程序可以共享这些程序集,有一点必须注意,就是存放在GAC中的程序集必须有一个唯一的名字,可以通过在.NET命令执行窗口中打入sn -k assemblyname.snk 来生成一个唯一的名称,叫做强名称,生成强名称后,会有一个公钥附加在此程序集上,用于阻止名字相似而被代替的危险。
.NET中对程序集的安全性提供了两种机制:一种是前面提到的强名称,一种是使用Signcode(可理解为数字签名)。Signcode.exe用来标记一个程序集,同时嵌入一个数字签名到程序集中,可以让用户识别创建此程序集的开发者。
(注:在GAC中不能有两个相同名称的强名称,否则就不叫强名称了,但可以存储一个程序集的多个拷贝而且在GAC中的程序集只能被拥有一定权限的用户删除)
关于程序集的版本号:每一个版本都有一个128位的版本号,表示为四部分:Major(为主版本号,项目有变化时即改变).Minor(添加一个功能到项目时改变).Build.Revision(后两个是自动更新的),这些版本信息可以通过在应用程序中的AssemblyInfo.cs文件来查看。
又是一堆的理论,下面介绍COM+的应用:在.NET中使用COM+服务的组件就叫做.NET服务组件,跟一般的组件不同,区别在于前者使用了COM+服务。使用.NET服务组件的目的也就是为了可以访问COM+服务的一些基类如ServicedComponent和自动事务处理,JIT,对象池和安全性方面等。
在使用.NET服务组件之前都必须注册服务组件,有三种方式:
1、手动注册:通过RegSvcs.exe命令行工具来注册,如:Regsvcs yourcomponent.dll 之后将产生一个yourcomponent.tlb类型库,包含了对象的类型信息(注意在使用该命令前必须先注册一个yourcomponent的强名称)
2、编程注册:使用RegistrationHelper类,主要是利用在IregistrationHelper接口中的方法。
3、动态注册:是指在执行应用程序过程中,检查安装组件的版本,如组件的正确版本没安装,则在运行时自动安装需要的版本,即自动注册。(注:调用自动注册的用户必须是Window2000 Administrative组的一个成员,因为动态注册无法改变COM+ 目录,否则注册过程失败)
四、实例剖析
1、首先新建一个类库。(在我的项目里叫XMLOperate)
它会生成两个文件,AssemblyInfo.cs和Class1.cs(我把Class1.cs改成了Main.cs,具体名称可以自己定)
2、添加引用(System.EnterpriseServices )
3、回到Main.cs:
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.EnterpriseServices;
namespace XMLOperator
{
/// <summary>
/// OMPmSAXMLOperator 的摘要说明。
/// </summary>
[ObjectPooling(MinPoolSize=0, MaxPoolSize=1)]
[JustInTimeActivation(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class XMLOperate : ServicedComponent
{
protected override void Construct(string constructString)
{
base.Construct(null);
}
protected override void Activate(){}
protected override void Deactivate(){}
protected override bool CanBePooled(){return true;}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
///
///把我的很多方法都去掉了,写个简单的visit来演示一下就OK了。
///
[AutoComplete]
public string visit(string name)
{
return "欢迎 " + name;
}
}
}
4、回到AssemblyInfo.cs,添加引用using System.EnterpriseServices;
添加代码:
//将组件设置为服务器启动模式。
[assembly: ApplicationActivation(ActivationOption.Server) ]
//制定应用服务器名称
[assembly: ApplicationName("XMLOperate")]
5、接下来,给服务器程序一个强名称(相当于注册)。打开 Visual Studio .Net2003 (也许你用的是2005)命令提示,找到文件的地址,输入sn -k ,生成密匙比如我的文件在D盘,work中,
D:\work\XMLOperate> sn -k XMLOperate.snk
XMLOperate.snk为生成的文件名称,( 执行完成后,文件里会多出一个文件server.snk )
6、强名称生成完后,回到程序中,在AssemblyInfo.cs中最后几排,可以发现[assembly: AssemblyKeyFile(" ")],把文件路径写进去[assembly: AssemblyKeyFile("../../XMLOperate.snk")]
7、生成解决方案,在OBJ \ debug 中会有个XMLOperate.dll,回到Visual Studio .Net2003 命令提示,到文件obj\debug目录下,执行regsvcs 命令,注册服务。(完全可以不用手工注册,在步骤9中,客户端调用new的时候的时候如果没有注册该组件服务,则系统会自动注册,详细请见(三)部分最后的注册方式。)
我的项目中是这样的
D:\work\XMLOperate\obj\debug > regsvcs XMLOperate.dll;
这样,服务器就构建完成。
打开我的电脑,控制面板,管理工具,组件服务,com+应用程序,现在我们可以看到com+中多了个,XMLOperate这个就是刚所建的服务器。
8、在XMLOperate上按右键,打开属性,修改安全性:调用身份验证级别为:无,模拟级别为标识。授权下的勾去掉( 这些是根据情况需要更改的,现在仅仅做个本机上的列子)。然后找到激活,远程服务器名称改成你自己机器的IP地址。
9、建立客户端。
建一个winfrom(在我的项目里其实有1个web service和一个window service来调用XMLOperate)
加入引用:
using System.EnterpriseServices;
using XMLOperate;
在客户端要引用的地方new 一下就可以直接用其中的方法了。
由于对COM+的理解还不是很透彻,如果有错误的地方或不够完美的地方,请不吝赐教!
欢迎和我交流,msn: [email protected]
本文地址:http://com.8s8s.com/it/it41745.htm