dotnet 下开发 COM+ 组件

dotnet 下开发 COM+ 组件,第1张

一 问题的提出

最终用户的每次请求 都将读取Mapping文件——可以通过缓存解决

xxx子系统需要不断的写入Mapping文件——也可以先写入内存然后批量写入文件解决

二 分析解决问题

由于分别有 个或更多子系统需要对同一文件进行读写 *** 作 而客户端又有很大的并发性 所以极可能出现读写冲突或错误 也必将影响系统的性能

通过调用共同的进程外组件的方式来读写文件 而这个共同的进程外组件只有在自身启动的时候把文件内容load到内存 当文件有变化时更新内存

三 +组件介绍

早在window 发布时就已经产生了+ 并集成在 *** 作系统中 在运行的时候是以服务的形式存在的 +增加了一系列的MTS(一种系统服务 用于管理数据库中的持久性数据 也处理在事务中的持久性消息队列和文件系统)服务

事务服务 它确保了在分布式系统中的数据完整性

安全服务 它的安全模型提供了处理安全性而不用编写任何代码的方法

同步服务 提供了有管理地解决组件中并发问题的方法 但却不用编写代码

资源管理 (包括资源管理器和资源分配器)管理数据库连接 网络连接和内存等

JIT激活 即(Just In Time)是从MTS继承下来的一项服务 当客户调用时才将该对象的一个实例保持为活跃状态并缓存在服务器内存中 使用完对象后 会通知MTS环境可以释放该对象所占用的资源了 如数据库连接

对象池 提供一个线程池来存放现成的对象 以供下次再用 是系统的一项自动服务 当有应用程序访问+组件时 即为应用程序创建该组件的一个实例并存放在对象池中 应用程序关闭后即销毁实例 可以自由配置组件使它的实例在池中的状态 实现了实例的重用性 提高应用程序的性能和伸缩性

基于角色的安全 这个容易理解 即验证角色 给予安全许可 给不同的用户予不同的权限

队列组件(MSMQ) 提供异步消息队列 可以自动按其形式将数据转换成数据包

共享属性管理器(SPM) 用来管理存储在内存中的对象状态信息 在一个服务器进程内可以用来共享多个对象间的状态 并提供并发处理

补偿资源管理器(CRM) 用于在处理事务期间生成日志文件并可处理系统崩溃 包括CRM工作器(是CRM的主要部分 通过CRM的基础设施提供的接口将事务的相关信息写入日志 并在需要时检索日志文件)和CRM补偿器(用于在事务完成后 将事务和生成的日志文件提交给执行事务的用户)

并发 即允许一个应用程序中的多个进程同时运行 进程被分成各组上下文(有相同需求的对象集合)包含在单元(一个进程内的一组上下文)中 一个进程可包含多个上下文 都涉及到不同的需求的对象而且每个上下文都有一个唯一的对象来提供+事务处理和JIT激活等服务 利用+提供的工具可以创建执行交易的多层应用程序 还可以处理线程分配的问题 OK 介绍完+的功能下面再介绍+的类型

+有几种不同用途的类型

1 应用程序代理 包含应用程序注册信息的文件 即当有客户访问远程计算机的服务器程序时 运行在客户端的应用程序代理就会将服务器应用程序的信息写入客户端器计算机中

2 服务器应用程序 即在+应用程序本身的进程内执行+应用程序 同时使用并发性来处理组件

3 库应用程序 是在客户应用程序的进程内执行的 装载在客户应用程序进程内的 使用基于任务的安全性 缺点是不支持远程访问和队列组件

4 +预安装应用程序 到管理工具中的组件服务中的+应用程序文件夹中查看就明白什么是+预安装应用程序了 它是在+安装过程中自动安装进组件服务的应用程序 不能修改也不能删除

同时涉及到一个叫 程序集(Assembly ) 的概念 它是CLR所有类型和其它资源(如位图文件等)的集合 可通过管理工具下的 配置 NET框架 来查看 包括有私有和共享的程序集 私有程序集 它只能被放在与该程序集相同路径的应用程序访问 默认为私有 必须放在使用它的应用程序的文件夹中 共享程序集 指添加在GAC(Global Assembly Cache)中的程序集 GAC是专门用来存放程序集中 使应用程序可以共享这些程序集 有一点必须注意 就是存放在GAC中的程序集必须有一个唯一的名字 可以通过在 NET命令执行窗口中打入sn k assemblyname snk 来生成一个唯一的名称 叫做强名称 生成强名称后 会有一个公钥附加在此程序集上 用于阻止名字相似而被代替的危险

NET中对程序集的安全性提供了两种机制 一种是前面提到的强名称 一种是使用Signcode(可理解为数字签名) Signcode exe用来标记一个程序集 同时嵌入一个数字签名到程序集中 可以让用户识别创建此程序集的开发者

(注 在GAC中不能有两个相同名称的强名称 否则就不叫强名称了 但可以存储一个程序集的多个拷贝而且在GAC中的程序集只能被拥有一定权限的用户删除)

关于程序集的版本号 每一个版本都有一个 位的版本号 表示为四部分 Major(为主版本号 项目有变化时即改变) Minor(添加一个功能到项目时改变) Build Revision(后两个是自动更新的) 这些版本信息可以通过在应用程序中的AssemblyInfo cs文件来查看

又是一堆的理论 下面介绍+的应用 在 NET中使用+服务的组件就叫做 NET服务组件 跟一般的组件不同 区别在于前者使用了+服务 使用 NET服务组件的目的也就是为了可以访问+服务的一些基类如ServicedComponent和自动事务处理 JIT 对象池和安全性方面等

在使用 NET服务组件之前都必须注册服务组件 有三种方式

1 手动注册 通过RegSvcs exe命令行工具来注册 如 Regsvcs yourponent dll 之后将产生一个yourponent tlb类型库 包含了对象的类型信息(注意在使用该命令前必须先注册一个yourponent的强名称)

2 编程注册 使用RegistrationHelper类 主要是利用在IregistrationHelper接口中的方法

3 动态注册 是指在执行应用程序过程中 检查安装组件的版本 如组件的正确版本没安装 则在运行时自动安装需要的版本 即自动注册 (注 调用自动注册的用户必须是Window Administrative组的一个成员 因为动态注册无法改变+ 目录 否则注册过程失败)

四 实例剖析

首先新建一个类库 (在我的项目里叫XMLOperate)

它会生成两个文件 AssemblyInfo cs和Class cs(我把Class cs改成了Main cs 具体名称可以自己定)

添加引用(System EnterpriseServices )

回到Main cs

using System

using System Reflection

using System Runtime InteropServices

using System EnterpriseServices

namespace XMLOperator

{

/// <summary>

/// OMPmSAXMLOperator 的摘要说明

/// </summary>

[ObjectPooling(MinPoolSize= MaxPoolSize= )]

[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

}

}

}

回到AssemblyInfo cs 添加引用using System EnterpriseServices

添加代码

//将组件设置为服务器启动模式

[assembly ApplicationActivation(ActivationOption Server) ]

//制定应用服务器名称

[assembly ApplicationName( XMLOperate )]

接下来 给服务器程序一个强名称(相当于注册) 打开 Visual Studio Net (也许你用的是 )命令提示 找到文件的地址 输入sn k 生成密匙比如我的文件在D盘 work中

D \work\XMLOperate> sn k XMLOperate snk

XMLOperate snk为生成的文件名称 ( 执行完成后 文件里会多出一个文件server snk )

强名称生成完后 回到程序中 在AssemblyInfo cs中最后几排 可以发现[assembly AssemblyKeyFile( )] 把文件路径写进去[assembly AssemblyKeyFile( ……/……/XMLOperate snk )]

生成解决方案 在OBJ \ debug 中会有个XMLOperate dll 回到Visual Studio Net 命令提示 到文件obj\debug目录下 执行regsvcs 命令 注册服务 (完全可以不用手工注册 在步骤 中 客户端调用new的时候的时候如果没有注册该组件服务 则系统会自动注册 详细请见(三)部分最后的注册方式 )

我的项目中是这样的

D \work\XMLOperate\obj\debug > regsvcs XMLOperate dll

这样 服务器就构建完成

打开我的电脑 控制面板 管理工具 组件服务 +应用程序 现在我们可以看到+中多了个 XMLOperate这个就是刚所建的服务器

在XMLOperate上按右键 打开属性 修改安全性 调用身份验证级别为 无 模拟级别为标识 授权下的勾去掉( 这些是根据情况需要更改的 现在仅仅做个本机上的列子) 然后找到激活 远程服务器名称改成你自己机器的IP地址

建立客户端

建一个winfrom(在我的项目里其实有 个web service和一个window service来调用XMLOperate)

加入引用

using System EnterpriseServices

using XMLOperate

lishixinzhi/Article/program/ASP/201311/21757


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10748454.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存