zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

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

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

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

SettingHelper
#region文件描述
//-------------------------------------------------------------------------------------------------
//描述:服务安装配置帮助类
//作者:鲍昊晟
//时间:2012-05-10
//-------------------------------------------------------------------------------------------------
#endregion
usingSystem;
usingSystem.IO;
usingSystem.Xml;
///<summary>
///服务安装配置帮助类
///</summary>
internalclassSettingHelper:IDisposable
{
#region私有成员
privatestring_ServiceName;
privatestring_DisplayName;
privatestring_Description;
#endregion
#region构造函数
///<summary>
///初始化服务配置帮助类
///</summary>
publicSettingHelper()
{
InitSettings();
}
#endregion
#region属性
///<summary>
///系统用于标志此服务的名称
///</summary>
publicstringServiceName
{
get{return_ServiceName;}
}
///<summary>
///向用户标志服务的友好名称
///</summary>
publicstringDisplayName
{
get{return_DisplayName;}
}
///<summary>
///服务的说明
///</summary>
publicstringDescription
{
get{return_Description;}
}
#endregion
#region私有方法
#region初始化服务配置信息
///<summary>
///初始化服务配置信息
///</summary>
privatevoidInitSettings()
{
stringroot=System.Reflection.Assembly.GetExecutingAssembly().Location;
stringxmlfile=root.Remove(root.LastIndexOf("\\")+1)+"ServiceSetting.xml";
if(File.Exists(xmlfile))
{
XmlDocumentdoc=newXmlDocument();
doc.Load(xmlfile);
XmlNodexn=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
{
thrownewFileNotFoundException("未能找到服务名称配置文件ServiceSetting.xml!");
}
}
#endregion
#endregion
#regionIDisposable成员
privatebooldisposed=false;
publicvoidDispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protectedvirtualvoidDispose(booldisposing)
{
if(!this.disposed)
{
if(disposing)
{
//manageddispose
_ServiceName=null;
_DisplayName=null;
_Description=null;
}
//unmanageddispose
}
disposed=true;
}
~SettingHelper()
{
Dispose(false);
}
#endregion
}

3、修改ProjectInstaller.cs文件,在修改构造函数publicProjectInstaller()如下:
复制代码代码如下:
ProjectInstaller
usingSystem.ComponentModel;
usingSystem.Configuration.Install;
namespaceWSInstallTest
{
[RunInstaller(true)]
publicpartialclassProjectInstaller:Installer
{
publicProjectInstaller()
{
InitializeComponent();
using(SettingHelpersetting=newSettingHelper())
{
serviceInstaller1.ServiceName=setting.ServiceName;
serviceInstaller1.DisplayName=setting.DisplayName;
serviceInstaller1.Description=setting.Description;
}
}
//endofclass
}
}

4、执行安装命令:
在开始菜单中找到“MicrosoftVisualStudio2008”-->“VisualStudioTools”-->“VisualStudio2008命令提示”,右键“以管理员身份运行”。
在命令行中输入以下命令:
复制代码代码如下:
SettingenvironmentforusingMicrosoftVisualStudio2008x86tools.
C:\Windows\system32>installutil/logfiled:\wsinstalltest.exe

5、当出现以下文字的时候就表明安装成功了
复制代码代码如下:
安装成功提示信息
Microsoft(R).NETFramework安装实用工具版本2.0.50727.5420
版权所有(C)MicrosoftCorporation。保留所有权利。
正在运行事务处理安装。
正在开始安装的“安装”阶段。
查看日志文件的内容以获得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、备注:
运行“scstarttestme”启动服务;
运行“scstoptestme”停止服务;
运行“scdeletetestme”删除服务。