转自:http://www.jb51.net/article/30549.htm
前段时间由于项目的需求,要在Windows里把同样的组件制作成多个不同名称的服务,这些服务完成类似的功能,仅需要修改业务配置文件
这下可把我难住了,难道要 在开发的代码中一个一个地设置想要的名称,然后重新编译,再注册成服务?
但是如果将来又要换个名称呢?再重新设置、 编译、注册一遍?这样操作太麻烦了!
于是我就想能不能通过在安装的时候进行配置,比如加一个xml文件记录要安装的服务的服务名等信息,每次安装前修改该xml文件就可以了。
操作:
1、首先添加一个配置文件到服务主程序的根目录,取名“ServiceSetting.xml”:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <Settings> 3 <ServiceName>testme</ServiceName> 4 <DisplayName>testmedisplay</DisplayName> 5 <Description>这里仅仅是个测试而已</Description> 6 </Settings>
2、然后添加一个类文件到服务主程序的根目录,取名"SettingHelper.cs":
1 SettingHelper 2 #region 文件描述 3 //------------------------------------------------------------------------------------------------- 4 // 描述:服务安装配置帮助类 5 // 作者:鲍昊晟 6 // 时间:2012-05-10 7 //------------------------------------------------------------------------------------------------- 8 #endregion 9 using System; 10 using System.IO; 11 using System.Xml; 12 /// <summary> 13 /// 服务安装配置帮助类 14 /// </summary> 15 internal class SettingHelper : IDisposable 16 { 17 #region 私有成员 18 private string _ServiceName; 19 private string _DisplayName; 20 private string _Description; 21 #endregion 22 #region 构造函数 23 /// <summary> 24 /// 初始化服务配置帮助类 25 /// </summary> 26 public SettingHelper() 27 { 28 InitSettings(); 29 } 30 #endregion 31 #region 属性 32 /// <summary> 33 /// 系统用于标志此服务的名称 34 /// </summary> 35 public string ServiceName 36 { 37 get { return _ServiceName; } 38 } 39 /// <summary> 40 /// 向用户标志服务的友好名称 41 /// </summary> 42 public string DisplayName 43 { 44 get { return _DisplayName; } 45 } 46 /// <summary> 47 /// 服务的说明 48 /// </summary> 49 public string Description 50 { 51 get { return _Description; } 52 } 53 #endregion 54 #region 私有方法 55 #region 初始化服务配置信息 56 /// <summary> 57 /// 初始化服务配置信息 58 /// </summary> 59 private void InitSettings() 60 { 61 string root = System.Reflection.Assembly.GetExecutingAssembly().Location; 62 string xmlfile = root.Remove(root.LastIndexOf('\') + 1) + "ServiceSetting.xml"; 63 if (File.Exists(xmlfile)) 64 { 65 XmlDocument doc = new XmlDocument(); 66 doc.Load(xmlfile); 67 XmlNode xn = doc.SelectSingleNode("Settings/ServiceName"); 68 _ServiceName = xn.InnerText; 69 xn = doc.SelectSingleNode("Settings/DisplayName"); 70 _DisplayName = xn.InnerText; 71 xn = doc.SelectSingleNode("Settings/Description"); 72 _Description = xn.InnerText; 73 doc = null; 74 } 75 else 76 { 77 throw new FileNotFoundException("未能找到服务名称配置文件 ServiceSetting.xml!"); 78 } 79 } 80 #endregion 81 #endregion 82 #region IDisposable 成员 83 private bool disposed = false; 84 public void Dispose() 85 { 86 Dispose(true); 87 GC.SuppressFinalize(this); 88 } 89 protected virtual void Dispose(bool disposing) 90 { 91 if (!this.disposed) 92 { 93 if (disposing) 94 { 95 //managed dispose 96 _ServiceName = null; 97 _DisplayName = null; 98 _Description = null; 99 } 100 //unmanaged dispose 101 } 102 disposed = true; 103 } 104 ~SettingHelper() 105 { 106 Dispose(false); 107 } 108 #endregion 109 }
3、修改ProjectInstaller.cs文件,在修改构造函数public ProjectInstaller()如下:
1 ProjectInstaller 2 using System.ComponentModel; 3 using System.Configuration.Install; 4 namespace WSInstallTest 5 { 6 [RunInstaller(true)] 7 public partial class ProjectInstaller : Installer 8 { 9 public ProjectInstaller() 10 { 11 InitializeComponent(); 12 using (SettingHelper setting = new SettingHelper()) 13 { 14 serviceInstaller1.ServiceName = setting.ServiceName; 15 serviceInstaller1.DisplayName = setting.DisplayName; 16 serviceInstaller1.Description = setting.Description; 17 } 18 } 19 //end of class 20 } 21 }
4、执行安装命令:
在开始菜单中找到“Microsoft Visual Studio 2008”-->“Visual Studio Tools”-->“Visual Studio 2008 命令提示”,右键“以管理员身份运行”。
在命令行中输入以下命令:
1 Setting environment for using Microsoft Visual Studio 2008 x86 tools. 2 C:Windowssystem32>installutil /logfile d:wsinstalltest.exe
5、当出现以下文字的时候就表明安装成功了
安装成功提示信息 Microsoft (R) .NET Framework 安装实用工具版本 2.0.50727.5420 版权所有(C) Microsoft Corporation。保留所有权利。 正在运行事务处理安装。 正在开始安装的“安装”阶段。 查看日志文件的内容以获得 d:wsinstalltest.exe 程序集的进度。 该文件位于 。 正在安装程序集“d:wsinstalltest.exe”。 受影响的参数是: logtoconsole = assemblypath = d:wsinstalltest.exe logfile = 正在安装服务 testme... 已成功安装服务 testme。 正在日志 Application 中创建 EventLog 源 testme... “安装”阶段已成功完成,正在开始“提交”阶段。 查看日志文件的内容以获得 d:wsinstalltest.exe 程序集的进度。 该文件位于 。 正在提交程序集“d:wsinstalltest.exe”。 受影响的参数是: logtoconsole = assemblypath = d:wsinstalltest.exe logfile = “提交”阶段已成功完成。 已完成事务处理安装。 C:Windowssystem32>
可以进入“服务”程序中查看刚才安装的服务已经安装好了。
6、备注:
运行“sc start testme”启动服务;
运行“sc stop testme”停止服务;
运行“sc delete testme”删除服务。