转自:http://www.jb51.net/article/30549.htm

前段时间由于项目的需求,要在Windows里把同样的组件制作成多个不同名称的服务,这些服务完成类似的功能,仅需要修改业务配置文件

这下可把我难住了,难道要 在开发的代码中一个一个地设置想要的名称,然后重新编译,再注册成服务? 
但是如果将来又要换个名称呢?再重新设置、 编译、注册一遍?这样操作太麻烦了! 
于是我就想能不能通过在安装的时候进行配置,比如加一个xml文件记录要安装的服务的服务名等信息,每次安装前修改该xml文件就可以了。 
操作: 
1、首先添加一个配置文件到服务主程序的根目录,取名“ServiceSetting.xml”:

 <?xml version="1.0" encoding="utf-8" ?>
<Settings>
<ServiceName>testme</ServiceName>
<DisplayName>testmedisplay</DisplayName>
<Description>这里仅仅是个测试而已</Description>
</Settings>

2、然后添加一个类文件到服务主程序的根目录,取名"SettingHelper.cs":

 SettingHelper
#region 文件描述
//-------------------------------------------------------------------------------------------------
// 描述:服务安装配置帮助类
// 作者:鲍昊晟
// 时间:2012-05-10
//-------------------------------------------------------------------------------------------------
#endregion
using System;
using System.IO;
using System.Xml;
/// <summary>
/// 服务安装配置帮助类
/// </summary>
internal class SettingHelper : IDisposable
{
#region 私有成员
private string _ServiceName;
private string _DisplayName;
private string _Description;
#endregion
#region 构造函数
/// <summary>
/// 初始化服务配置帮助类
/// </summary>
public SettingHelper()
{
InitSettings();
}
#endregion
#region 属性
/// <summary>
/// 系统用于标志此服务的名称
/// </summary>
public string ServiceName
{
get { return _ServiceName; }
}
/// <summary>
/// 向用户标志服务的友好名称
/// </summary>
public string DisplayName
{
get { return _DisplayName; }
}
/// <summary>
/// 服务的说明
/// </summary>
public string Description
{
get { return _Description; }
}
#endregion
#region 私有方法
#region 初始化服务配置信息
/// <summary>
/// 初始化服务配置信息
/// </summary>
private void InitSettings()
{
string root = System.Reflection.Assembly.GetExecutingAssembly().Location;
string xmlfile = root.Remove(root.LastIndexOf('\\') + ) + "ServiceSetting.xml";
if (File.Exists(xmlfile))
{
XmlDocument doc = new XmlDocument();
doc.Load(xmlfile);
XmlNode xn = doc.SelectSingleNode("Settings/ServiceName");
_ServiceName = xn.InnerText;
xn = doc.SelectSingleNode("Settings/DisplayName");
_DisplayName = xn.InnerText;
xn = doc.SelectSingleNode("Settings/Description");
_Description = xn.InnerText;
doc = null;
}
else
{
throw new FileNotFoundException("未能找到服务名称配置文件 ServiceSetting.xml!");
}
}
#endregion
#endregion
#region IDisposable 成员
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
//managed dispose
_ServiceName = null;
_DisplayName = null;
_Description = null;
}
//unmanaged dispose
}
disposed = true;
}
~SettingHelper()
{
Dispose(false);
}
#endregion
}

3、修改ProjectInstaller.cs文件,在修改构造函数public ProjectInstaller()如下:

 ProjectInstaller
using System.ComponentModel;
using System.Configuration.Install;
namespace WSInstallTest
{
[RunInstaller(true)]
public partial class ProjectInstaller : Installer
{
public ProjectInstaller()
{
InitializeComponent();
using (SettingHelper setting = new SettingHelper())
{
serviceInstaller1.ServiceName = setting.ServiceName;
serviceInstaller1.DisplayName = setting.DisplayName;
serviceInstaller1.Description = setting.Description;
}
}
//end of class
}
}

4、执行安装命令: 
在开始菜单中找到“Microsoft Visual Studio 2008”-->“Visual Studio Tools”-->“Visual Studio 2008 命令提示”,右键“以管理员身份运行”。 
在命令行中输入以下命令:

 Setting environment for using Microsoft Visual Studio  x86 tools.
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”删除服务。

c#开发的程序安装时动态指定windows服务名称的更多相关文章

  1. log4j2配置文件动态指定日志文件名称

    按照习惯性思维,log4j2中xml中取系统属性应该和log4j一样,但是结果却并不是我们想的这样,存在一定的差别,log4j中的配置可参考 log4j配置文件动态指定日志文件名称 . 现在就来看看到 ...

  2. 安装自创建的windows服务。

    安装自创建的windows服务. 使用工具InstallUtil.exe进行安装和卸载创建的windows服务 安装:C:/WINDOWS/Microsoft.NET/Framework/v2.0.5 ...

  3. linux c开发: 在程序退出时进行处理

    有时候,希望程序退出时能进行一些处理,比如保存状态,释放一些资源.c语言开发的linux程序,有可能正常退出(exit),有可能异常crash,而异常crash可能是响应了某信号的默认处理.这里总结一 ...

  4. 免安装版本tomcat 指定的服务并未以已安装的服务存在,Unable to open the service

    今天在自己的电脑上安装了Tomcat6.0.14,是在Tomcat主页上直接下载的免安装版.但是把文件解压的之后,双击Tomcat6w.exe时,去出现了"指定的服务并未以已安装的服务存在, ...

  5. .Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)

    创建一个Windows服务项目:解决方案(右击)——> 添加 ——> 新建项目——>项目类型选择Windows——>模板选择Windows服务 ,如图: 编写Windows服务 ...

  6. 【.Net 学习系列】-- .Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)

    创建一个Windows服务项目:解决方案(右击)——> 添加 ——> 新建项目——>项目类型选择Windows——>模板选择Windows服务 ,如图: 编写Windows服务 ...

  7. 【源码下载】分享一个支持自安装自卸载的Windows服务

    NetworkComms网络通信框架序言 这个程序来自  www.codeproject.com 具体的出处就忘了 服务器端的程序,我一般采用在windows服务中调用打开的方式,这样既能看到界面,又 ...

  8. Java Service Wrapper 发布Java程序或者jar包为Windows服务

    下载Windows版本:http://nchc.dl.sourceforge.net/sourceforge/wrapper/wrapper-windows-x86-32-3.2.3.zip 现在目前 ...

  9. MongoDB的安装启动及做成windows服务

    直接上干货. 官网地址:https://www.mongodb.com/download-center?jmp=nav#community 点击图中链接进入所有版本的下载列表 我下载的是3.6.5版本 ...

随机推荐

  1. 解决msi文件在XP上安装未完成

    下载Ocra工具,然后删除"DIRCA_CheckFx"和"VSDCA_VsdLaunchConditions"这两个Action即可.第一步,下载并打开Ocr ...

  2. Java中的数据结构及排序算法

    (明天补充) 主要是3种接口:List Set Map List:ArrayList,LinkedList:顺序表ArrayList,链表LinkedList,堆栈和队列可以使用LinkedList模 ...

  3. 如何选择正确的angular2学习曲线?

    参考: https://www.zhihu.com/question/50800464/answer/122921043 https://www.zhihu.com/question/48670501 ...

  4. Linux shell常用命令

    1. sz 和 rz  sz命令发送文件到本地: # sz filename rz命令本地上传文件到服务器: # rz 执行该命令后,在弹出框中选择要上传的文件即可.

  5. 1-10 RHLE7 系统进程管理

    1.1-Linux进程管理 程序.进程.线程 程序:一组指令的集合    QQ 进程:程序的执行就是进程.也可以把进程看成一个独立的程序,在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代 ...

  6. OpenCL将数组从内存copy到显存

    本来想对上一篇博客做优化,优化效果不明显.但知识点还是要记一下. 初衷是想把上一篇博客中定义域的计算搬到CPU来计算,因为定义域的计算对于每一个kernel都是一样的,所以直接读取应该是可以进一步减小 ...

  7. UVA-10054 The Necklace (欧拉回路)

    题目大意:有n个珠子,珠子两边的颜色已知,问能否连成一条项链.(两个珠子可以项链当且仅当一个珠子的一边颜色与另一个珠子的另一边颜色相同). 题目分析:欧拉回路.将颜色视作节点,珠子当做边,问题变成了找 ...

  8. 让你的ansible飞起来

    一.SSH Multiplexing 1 配置 vim /etc/ssh/ssh_config Host * GSSAPIAuthentication yes # If this option is ...

  9. APUE学习笔记——5.2流与文件对象、fwide

    1 流         当一个文件被打开时,可以获得文件描述符.通过文件描述符可以对文件进行I/O操作.而I/O操作是通过流完成的. 流的定向:         在Unix系统中,使用 ASCII标准 ...

  10. MySQL单独存放表空间Innodb_file_per_table

    在mysql中Innodb_file_per_table参数的作用是什么呢,其实许多的朋友是不知道的,今天我们来看这篇MySQL单独存放表空间Innodb_file_per_table参数详解之后你就 ...