欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-01 21:29:46
这下可把我难住了,难道要 在开发的代码中一个一个地设置想要的名称,然后重新编译,再注册成服务? 但是如果将来又要换个名称呢?再重新设置、 编译、注册一遍?这样操作太麻烦了!...
这下可把我难住了,难道要 在开发的代码中一个一个地设置想要的名称,然后重新编译,再注册成服务?
但是如果将来又要换个名称呢?再重新设置、 编译、注册一遍?这样操作太麻烦了!
于是我就想能不能通过在安装的时候进行配置,比如加一个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('\\') + 1) + "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 2008 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”删除服务。