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

 更新时间:2012年06月09日 00:19:19   作者:  
前段时间由于项目的需求,要在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('\\') + 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”删除服务。

相关文章

  • C#开启线程的四种示例

    C#开启线程的四种示例

    这篇文章主要介绍了C#开启线程的四种方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-10-10
  • C#使用ScrapySharp快速从网页采集数据

    C#使用ScrapySharp快速从网页采集数据

    这篇文章介绍了使用ScrapySharp快速从网页采集数据的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#的泛型方法解析

    C#的泛型方法解析

    本文讲解了C#2.0引入的泛型知识,主要包含泛型类、泛型接口、泛型委托,并且重点讲解了泛型方法,已经泛型的约束分类。最后给了一些利用泛型方法操作xml的方法。希望对大家有所帮助
    2016-12-12
  • C# linq查询之动态OrderBy用法实例

    C# linq查询之动态OrderBy用法实例

    这篇文章主要介绍了C# linq查询之动态OrderBy用法,实例分析了C#采用linq方式查询时动态排序的相关技巧,需要的朋友可以参考下
    2015-06-06
  • WPF实现绘制饼状统计图的示例代码

    WPF实现绘制饼状统计图的示例代码

    这篇文章主要为大家详细介绍了如何使用WPF实现绘制简单的饼状统计图,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • 手动编译C#代码的方法

    手动编译C#代码的方法

    在本文里小编给大家分享的是关于手动编译C#代码的方法和步骤,对此有需要的朋友们可以学习下。
    2018-12-12
  • 详解WPF的InkCanvas选择模式

    详解WPF的InkCanvas选择模式

    这篇文章主要介绍了WPF InkCanvas选择模式的相关资料,帮助大家更好的理解和学习使用c# wpf,感兴趣的朋友可以了解下
    2021-04-04
  • C# 预处理器指令的用法

    C# 预处理器指令的用法

    本文主要介绍了C# 预处理器指令的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • c#枚举值增加特性说明(推荐)

    c#枚举值增加特性说明(推荐)

    这篇文章主要介绍了c#枚举值增加特性说明(推荐),需要的朋友可以参考下
    2017-05-05
  • C#面向切面编程之AspectCore用法详解

    C#面向切面编程之AspectCore用法详解

    AspectCore 是Lemon名下的一个国产Aop框架,提供了一个全新的轻量级和模块化的Aop解决方案,下面我们就来深入了解下AspectCore在C#中的具体使用吧
    2024-01-01

最新评论