c#开发的程序安装时动态指定windows服务名称
转自: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服务名称的更多相关文章
- log4j2配置文件动态指定日志文件名称
按照习惯性思维,log4j2中xml中取系统属性应该和log4j一样,但是结果却并不是我们想的这样,存在一定的差别,log4j中的配置可参考 log4j配置文件动态指定日志文件名称 . 现在就来看看到 ...
- 安装自创建的windows服务。
安装自创建的windows服务. 使用工具InstallUtil.exe进行安装和卸载创建的windows服务 安装:C:/WINDOWS/Microsoft.NET/Framework/v2.0.5 ...
- linux c开发: 在程序退出时进行处理
有时候,希望程序退出时能进行一些处理,比如保存状态,释放一些资源.c语言开发的linux程序,有可能正常退出(exit),有可能异常crash,而异常crash可能是响应了某信号的默认处理.这里总结一 ...
- 免安装版本tomcat 指定的服务并未以已安装的服务存在,Unable to open the service
今天在自己的电脑上安装了Tomcat6.0.14,是在Tomcat主页上直接下载的免安装版.但是把文件解压的之后,双击Tomcat6w.exe时,去出现了"指定的服务并未以已安装的服务存在, ...
- .Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)
创建一个Windows服务项目:解决方案(右击)——> 添加 ——> 新建项目——>项目类型选择Windows——>模板选择Windows服务 ,如图: 编写Windows服务 ...
- 【.Net 学习系列】-- .Net 指定时间段内定时执行的Windows服务(System.Threading.Thread)
创建一个Windows服务项目:解决方案(右击)——> 添加 ——> 新建项目——>项目类型选择Windows——>模板选择Windows服务 ,如图: 编写Windows服务 ...
- 【源码下载】分享一个支持自安装自卸载的Windows服务
NetworkComms网络通信框架序言 这个程序来自 www.codeproject.com 具体的出处就忘了 服务器端的程序,我一般采用在windows服务中调用打开的方式,这样既能看到界面,又 ...
- Java Service Wrapper 发布Java程序或者jar包为Windows服务
下载Windows版本:http://nchc.dl.sourceforge.net/sourceforge/wrapper/wrapper-windows-x86-32-3.2.3.zip 现在目前 ...
- MongoDB的安装启动及做成windows服务
直接上干货. 官网地址:https://www.mongodb.com/download-center?jmp=nav#community 点击图中链接进入所有版本的下载列表 我下载的是3.6.5版本 ...
随机推荐
- 构建hadoop集群时遇到的问题
在构建hadoop集群时,出现过主节点中的namenode或datanode启动不成功的问题.在日志文件中往往会显示namenode和datanode中clusterID不相同的问题,这个问题往往都是 ...
- 设置table的td宽度,不随文字变宽
页面中table宽度设置width="600px"之后,宽度仍然不是固定的,文字太长后不换行,把table都撑变形了. 解决办法: table 设置 宽度,绝对宽度和相对都可以 t ...
- [Vue]组件——实现动态组件:keep-alive的使用
1.在app.vue中用一个 <keep-alive> 元素将其动态组件包裹起来: keepAlive为true时,第一次被创建的时候缓存下来,为false时,不会缓存 <keep- ...
- 转载:Chrome 控制台不完全指南
Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「 ...
- 在网页链接中打开qq或者微信
打开微信: 先说第一种,大家知道,在自己的微信资料里有个二维码,别人扫描后可以查看你的资料添加你,把二维码扫描后,得到的地址是:http://weixin.qq.com/r/ykzexmzEPzFAr ...
- intent Filter
intent Filter 一.介绍 如果一个 Intent 请求在一片数据上执行一个动作, Android 如何知道哪个应用程序(和组件)能用来响应这个请求呢? Intent Filter就是 用来 ...
- 如何在 Ubuntu 中安装 QGit 客户端
QGit是一款由Marco Costalba用Qt和C++写的开源的图形界面 Git 客户端.它是一款可以在图形界面环境下更好地提供浏览版本历史.查看提交记录和文件补丁的客户端.它利用git命令行来执 ...
- 【转】c++析构函数(Destructor)
创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存.关闭打开的文件等,这个函数就是析构函数. 析构函数(Destructor)也 ...
- Highcharts 测量图;Highcharts 圆形进度条式测量图;Highcharts 时钟;Highcharts 双轴车速表;Highcharts 音量表(VU Meter)
Highcharts 测量图 配置 chart.type 配置 配置 chart 的 type 为 'gauge' .chart.type 描述了图表类型.默认值为 "line". ...
- bzoj2241
题解: 暴力枚举锤子大小 然后前缀和判断是否可行 代码: #include<bits/stdc++.h> #define N 105 using namespace std; int m, ...