zoukankan      html  css  js  c++  java
  • 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: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”删除服务。

  • 相关阅读:
    马尔科夫模型
    统计自然语言处理(第2版)目录
    linux运维学习笔记随想
    Redis 入门:(1)Linux下使用
    TextRank算法原理及应用示例
    实验十 团队作业6:团队项目用户验收&Beta冲刺
    关于tensorflow
    实验九 团队作业6:团队项目编码&Alpha冲刺
    实验八 团队作业4—团队项目需求建模与系统设计
    实验七 团队作业3:团队项目需求分析与原型设计
  • 原文地址:https://www.cnblogs.com/yf2011/p/5231293.html
Copyright © 2011-2022 走看看