`
lovnet
  • 浏览: 6877846 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

企业服务的项目模版--一个实现自动注册服务的跨进程缓存的例子

阅读更多

下载连接:http://download.csdn.net/source/237101

企业服务(Com+)作为一项重要的企业级编程,配置比较麻烦,需要手动执行很多操作,所以我以一个用com+实现的跨进程缓存为例子,展示怎么使用InstallUtil和PostBuild事件自动完成这些工作,并提供给大家一个企业服务项目模版,方便大家使用,大家用这个模版项目,往里面放上自己的逻辑,就可以直接使用了(这里要多谢蝈蝈的努力,这是他对从com+的一些文章http://beta.joycode.com/ghj/category/1320.aspx,大家可以参考)

解决方案里有三个项目,一个服务端(ComPlusServerTemplate),一个客户端(ClientTemplate),一个公共组件(Component),实现了一个简单的进程独立的缓存,展示了

  • COM+简单调用
  • 传递自定义参数
  • 实现跨进程单件

我大概讲解一下利用.Net工具InstallUil,和Visual Studio的编译事件自动话安装企业服务的方法,由于下载的代码里面都有详细注释,具体大家自己下了看,我不再赘述,我在这里只是点出一些关键的地方.在以后的篇幅里,我会介绍怎样传递自定义参数,用Com+来实现跨进程的单件,以及怎样调试Com+.

怎样使用InstallUtil.exe自定义企业服务安装:

安装企业服务需要做两件事情,一把所有引用的程序集放入GAC,然后把自己注册为企业服务

手动的话,一般编译完成后我们利用visual studio带的工具gacutil来注册到GAC,而后利用regsvc来完成注册过程

其实.Net自己带了一个InstallUtil.exe,可以用来帮助大家通过程序完成上面的工作

我先简单介绍一下他的工作原理,这个工具可以迅速安装服务应用程序,最重要的是,他可以程序集中的自定义的安装组件来安装Com+,详见MSDN:http://www.msdn.net/library/chs/default.asp?url=/library/CHS/cptools/html/cpconinstallerutilityinstallutilexe.asp

安装组件必须从System.Configuration.Install.Installer继承,需要引用程序集System.Configuration.Install,通过重载Installer的Install和UnInstall方法件里我们就可以实现自定义安装和卸载

我们来看看Install方法中主要的安装代码:(封装在了InstallHelper里)

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> //取得当前Assembly,注意这个Assembly就是我们要安装的Assembly,因为Installer就包含在这个Assembly里面 Assembly currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
string assemblyFullPath = GetAssemblyFullPath(currentAssembly.Location);
string assemblyName = Path.GetFileName(currentAssembly.Location);
Publish publisher
= new Publish();
//把自己放入GAC publisher.GacInstall(assemblyFullPath);

/*把引用的程序集放入GAC,
* 需要说明的是不是所有引用的程序集都需要放入GAC,只有那些确实在运行中用到的才用,比如
* 我在这里排除了Interop.COMAdmin程序集,因为他只在安装中会用到,实际运行时不会用到,
* 这个东西的用处后面会讲到,当然,你还可以扩展一下这个程序,让需要用到的程序集从配置文件里读出
*/ Assembly ass; foreach (AssemblyName assName in currentAssembly.GetReferencedAssemblies())
{
ass
= System.Reflection.Assembly.Load(assName);
if (!ass.GlobalAssemblyCache && assName.Name != "Interop.COMAdmin")
{
MessageBox.Show(
string.Format("Assembly \"{0}\" has been loaded into GAC ",assName.FullName));
publisher.GacInstall(GetAssemblyFullPath(ass.Location));
}
}

// 把自己安装为企业服务 string ApplicationName = InstallComponent(stateSaver, assemblyName, assemblyFullPath, installObject);

// 下面是把企业服务设为一直运行,默认当企业服务空闲时会停止,这里用到了COMAdmin这个组件来实现
//他的功能十分强大,具体用法参见http://blog.joycode.com/ghj/archive/2006/12/08/88733.aspx COMAdmin.COMAdminCatalog ca = new COMAdmin.COMAdminCatalogClass();
COMAdmin.COMAdminCatalogCollection cacc
= (COMAdmin.COMAdminCatalogCollection)ca.GetCollection("Applications");
cacc.Populate();
foreach (COMAdmin.COMAdminCatalogObject cac in cacc)
{
if (cac.Name.ToString() == ApplicationName)
{
cac.set_Value(
"RunForever", true);
cacc.SaveChanges();
break;
}
}

安装企业服务的时候,我们调用了InstallComponent方法,在这个方法里具体实现了企业服务的安装,在这个函数里面,注意这个语句

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> /*Com+的运行时目录是在系统目录里,所以程序集要用到的配置文件可能访问不到(当然不能把配置文件考过去,不信你可以试试)
* 所以我们需要配置他的应用程序根目录,让Com+仍然能正常的访问配置信息,由于服务器系统不同,不是所有的服务器都支持
* 这个属性,所以ComPlusHasApplicationRootDirectory()包含了对系统是否支持此属性的判断
*/ if (ComPlusHasApplicationRootDirectory())
{
regConfig.ApplicationRootDirectory
= Path.GetDirectoryName(assemblyFullPath);

}

注:操作系统判断参见http://www.cnblogs.com/yizhu2000/archive/2007/08/26/870666.html

怎样使用编译事件来完成自动安装

在项目的PostBuild事件中插入对InstallUtil的调用,在项目属性中找到BuildEvent页,在这里我们可以定义项目编译前后的动作

PostBuild

<图1>

点选EditPostBuildEvent,我们就可以编辑编译后希望执行的CommandLine了.注意在这里有很多vs定义号的宏可以使用,我们通过点击编辑窗体下面的macro按钮看到这些宏代表的具体内容

Edit

<图2>

主要代码如下

cd "$(TargetDir)"
"$(DevEnvDir)../../SDK\v2.0\Bin\gacutil.exe" /u "$(TargetName)"
"%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe" "$(TargetPath)"

(在项目里面还对64位和32位系统进行了判断,因为两种系统.net目录是不同的)$(DevEnvDir)是vs路径,$(TargetPath)就是项目的输出文件,第一行把他从gac中删除,接着运行InstallUtil.exe来安装服务,

这里有两个值得注意的问题,就是在运行InstallUtil进行安装的时候,待安装的模块一定不要在Gac里,否则,如果你有引用其他不在GAC中的项目,那安装会报

System.IO.FileNotFoundException:找不到引用的XX程序集或者他的依赖项,这是因为由于你的程序集在GAC中,运行的时候运行环境会在GAC的目录中中找你引用的程序集,如果找不到,就报告错误了,所以我需要先从gac中删除这个项目,另外,路径最后用双引号扩起来,不然如果路径中有空格可能会报错


最后重申一下一些注意事项

1)所有需要放入GAC的项目必须签名,方法如图

sign

2)保证所有需要被企业服务调用到的服务都是ComVisible的

方法是在你的项目的AssemblyInfo.cs里面加上[assembly: ComVisible(true)]

或者找到项目属性Application页,点击AssemblyInfo按钮,把最下面的Make assembly COM-Visible勾选上(见图)comvisible

3)最后,最后为需要放入GAC的程序集固定一个版本号,否则每次编译,都会把一个新版本的dll放入GAC,等你打开GAC列表的时候,会看到一长串名字相同但版本不同的dll

(上图对应的地方设置Assembly Version)

http://www.cnblogs.com/yizhu2000/services/trackbacks/874284.aspx

分享到:
评论

相关推荐

    remoting 很好的例子

    这个例子可能包含了一个简单的Remoting实现,演示了如何创建和使用远程对象。通过分析代码,我们可以学习到如何配置通道、创建和注册服务器对象,以及在客户端创建代理并进行交互。这对于我们理解和应用.NET ...

    模板IT系统安装部署手册-例子.docx

    通过以上内容,我们可以看到,一个完整的IT系统安装部署不仅涉及操作系统和特定应用的安装,还包括硬件配置、软件环境搭建、内部类编程实践等多个层面,需要综合考虑系统性能、安全性和稳定性。在实施过程中,严格...

    JAVA上百实例源码以及开源项目源代码

    Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。...

    .NET Remoting 实现远程数据库访问源码

    .NET Remoting是微软.NET框架提供的一种技术,用于在应用程序之间创建高效的、安全的通信机制。它允许对象在不同的进程甚至...同时,这个例子也为我们提供了一个模板,可以以此为基础开发自己的跨进程或跨网络的服务。

    django 学习笔记(1)—— python和web开发框架(csdn)————程序.pdf

    在这个例子中,我们实现了简单的URL路由和模板替换,但实际的Web框架如Django提供了更高级的特性,如自动化URL配置、ORM(对象关系映射)以处理数据库操作,以及强大的模板语言,让开发者能更专注于应用逻辑而非底层...

    Django如何实现内容缓存示例详解

    接下来,我们来看一个简单的例子,演示如何在Django中使用缓存。 假设我们有一个视图函数`my_view`,它会从数据库中获取数据并返回给用户。我们可以使用Django的缓存机制来优化这个过程: ```python from django....

    vuejs资料、实战例子+代码+笔记

    这些内容分布在day1至day11的不同压缩包文件中,每个文件可能对应一个或多个主题,通过逐步学习和实践,可以深入理解Vue.js并运用到实际项目中。记得每个阶段都动手实践,结合笔记加深理解,才能真正掌握Vue的魅力。

    Shell脚本专家指南

    - 提供了一个用于搭建Linux系统的脚本模板。 #### 第39章 系统快照 - **快照脚本**:介绍了一个用于创建系统快照的脚本。 - **快照升级**:演示了如何升级系统快照。 - **创建最新快照**:提供了创建最新系统快照的...

    Android应用源码安卓源码(172个合集).zip

    OpenSudoku一个简单的九宫格数独游戏.zip OssSystem(OA系统图书管理简单版).rar Phonegap+HTML5+CSS3+jQuer简单界面模板示例及源码.rar ProgressBar 几乎全部的用法.rar QQ_UI之分类菜单DEMO.zip QQ的登录界面 源...

    OCA评估测试 中英结合

    - 使用DBCA创建数据库时如果没有保存模板定义,后续如果想要复制该数据库,可以通过重新创建一个数据库并使用相同的配置参数来实现。具体步骤如下: - 再次启动DBCA。 - 选择“创建数据库”选项。 - 在数据库类型...

    Perl编程思想

    TemplateToolkit是一个模板引擎,用于分离视图层和业务逻辑层。 **4.4 Maypole请求的阶段** Maypole将请求处理过程分为几个阶段,每个阶段都有特定的任务。 **4.5 BuySpy实现** - **4.5.1 组件和模版** BuySpy...

    内存管理内存管理内存管理

    因此,当加载一个进程时,它会得到一个取决于某个称为系统中断点(system break)的特定地址的初始内存分配。该地址之后是未被映射的内存 —— 用于在 RAM 或者硬盘中没有分配相应物理位置的内存。因此,如果一...

    Scrapy文档1.4.0 文档

    - **实践项目**:教程包含实际的例子,如如何构建第一个爬虫项目等。 ##### 2.4 示例 - **案例分析**:提供了多个实际项目的示例代码,包括简单的数据抓取任务到复杂的多页面爬取项目。 - **代码解析**:每个示例都...

    CSCI详细设计1

    本文档详细介绍了CSCI详细设计1的技术架构和实现细节,该系统是一个音乐分享平台,旨在提供高质量的音乐体验和推荐服务。下面是该系统的技术架构和实现细节: 功能模块 1. 歌手模块:该模块负责歌手信息的维护、列...

    24种设计模式介绍与6大设计原则

    - **定义**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - **应用场景**:当一个对象需要向多个对象发送消息时。 - **实例**:在新闻系统中,...

    Joomla 1.6 初学者指南

    - Joomla 是一个免费且开源的内容管理系统(CMS),它允许用户轻松创建、管理和发布网站内容。 - Joomla 的优势在于其灵活性、扩展性和社区支持。它可以用于构建从小型个人博客到大型企业级应用的各类网站。 - **WHO...

    VC++自己写的先进先出队列的例子_QueueDemo

    在这个“VC++自己写的先进先出队列的例子_QueueDemo”中,开发者利用VC++2008这一经典的微软开发环境,展示了如何用C++语言实现这一数据结构。这个程序对于理解队列的工作原理以及在处理大量等待处理的数据时的应用...

    flask框架jinja2模板与模板继承实例分析

    在提供的代码中使用了SimpleCache,它是一个简单的缓存系统,只适用于单进程环境。SimpleCache使用内存来存储缓存数据,所以当服务器重启时缓存将失效。需要注意的是,实际部署中应该使用适合生产环境的缓存解决方案...

    操作系统(内存管理)

    因此,当加载一个进程时,它会得到一个取决于某个称为 系统中断点(system break)的特定地址的初始内存分配。该地址之后是未被映射的内存 —— 用于在 RAM 或者硬盘中没有分配相应物理位置的内存。因此,如果一个...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    5.18.1 从Calendar控件中选择一个日期 149 5.18.2 从日历中选择要输出的日期格式 150 5.18.3 选择日期、星期或月份 150 5.18.4 使用日期范围 151 5.18.5 修改日历的样式和操作方式 153 5.19 AdRotator服务器...

Global site tag (gtag.js) - Google Analytics