C# Windows 服务,带命令行安装程序和 GUI
创建带有命令行安装程序的 C# Windows 服务
引言
有很多教程解释如何使用 C# 创建 Windows 服务。 几乎所有教程都希望你使用一个名为 InstallUtil.exe 的命令行实用程序来安装服务。 但是,如果要在没有此工具的机器上安装服务怎么办? 为什么我一开始就应该使用它? 使用命令行参数甚至 GUI 创建可以自行安装和卸载的服务非常容易。 这些代码片段可以在不同的地方找到。 让我们把它们放在一起!
背景
为了解析命令行参数,我使用我的库 CLAReloaded。
附带的代码包含一个示例服务,它每 30 秒将内容写入日志文件。 这是一个常见的例子。 大部分代码是由 Visual Studio 创建的,包括实际的安装程序对象。 有关详细信息,请参阅此 教程。
Using the Code
拥有服务(包括安装程序)后,首先需要设置它的名称、友好名称和描述。 它们稍后将在服务管理器中可见。 在附带的示例中,它们是 serviceInstaller
的属性,而 serviceInstaller
又是 SampleServiceInstaller
的子项。
然后,可以使用以下四行代码进行安装/卸载
TransactedInstaller installer = new TransactedInstaller();
installer.Context = new InstallContext(null, null);
installer.Context.Parameters["assemblyPath"] = Assembly.GetExecutingAssembly().Location;
installer.Install(new Hashtable());
//installer.Uninstall(null);
那么,为什么要使用 InstallUtil.exe 呢? 我真的不知道...
关注点
这里一个有趣的细节是,传递给安装程序的服务唯一引用是服务在硬盘上的位置。 无需传递服务名称或服务类的实例。 这是可能的,因为程序可以区分它是作为程序还是服务被调用。 这是通过以下方式完成的
if (Environment.UserInteractive) {
//run as programm
} else {
//run as service
}
你可以设置一些参数来配置安装过程。 它们基本上与可以传递给 InstallUtil.exe 的命令行参数相同。 例如,在调用实际的安装/卸载方法之前,添加以下行
installer.Context.Parameters["logFile"] = "installer_logfile.log";
installer.Context.Parameters["logToConsole"] = "false";
installer.Context.Parameters["showCallStack"] = "";
要从控制台应用程序启动 GUI 窗体,你只需要执行以下操作
Application.EnableVisualStyles();
Application.Run(new SampleForm());
如果在启动服务时遇到错误 5“拒绝访问”,请确保文件可被用户配置文件 SYSTEM
读取和执行。
如果安装/卸载失败,请确保你以管理员权限运行 WindowsService1.exe。
历史
- 2015-11-09:初始发布