c#开发的程序安装时动态指定windows服务名称

转自: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:\Windows\system32>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:\Windows\system32> 

可以进入“服务”程序中查看刚才安装的服务已经安装好了。 
6、备注: 
运行“sc start testme”启动服务; 
运行“sc stop testme”停止服务; 
运行“sc delete testme”删除服务。

 

posted @ 2016-03-01 15:46  J.Y  阅读(873)  评论(0编辑  收藏  举报