Answers:
在您的Installer类中,为AfterInstall事件添加一个处理程序。然后,您可以在事件处理程序中调用ServiceController来启动服务。
using System.ServiceProcess;
public ServiceInstaller()
{
//... Installer code here
this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}
void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
ServiceInstaller serviceInstaller = (ServiceInstaller)sender;
using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
{
sc.Start();
}
}
现在,当您在安装程序上运行InstallUtil时,它将安装并自动启动服务。
ServiceController
using 包装在using语句中也没有什么坏处。
serviceInstaller
是事件处理程序中所ServiceInstaller
引用的对象sender
,通常在ServiceInstaller()
构造函数中实例化。因此,您可以ServiceInstaller serviceInstaller = (ServiceInstaller)sender;
在using
语句之前添加。
重构后,这是一个具有自动启动功能的完整Windows服务安装程序的示例:
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;
namespace Example.of.name.space
{
[RunInstaller(true)]
public partial class ServiceInstaller : Installer
{
private readonly ServiceProcessInstaller processInstaller;
private readonly System.ServiceProcess.ServiceInstaller serviceInstaller;
public ServiceInstaller()
{
InitializeComponent();
processInstaller = new ServiceProcessInstaller();
serviceInstaller = new System.ServiceProcess.ServiceInstaller();
// Service will run under system account
processInstaller.Account = ServiceAccount.LocalSystem;
// Service will have Start Type of Manual
serviceInstaller.StartType = ServiceStartMode.Automatic;
serviceInstaller.ServiceName = "Windows Automatic Start Service";
Installers.Add(serviceInstaller);
Installers.Add(processInstaller);
serviceInstaller.AfterInstall += ServiceInstaller_AfterInstall;
}
private void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
ServiceController sc = new ServiceController("Windows Automatic Start Service");
sc.Start();
}
}
}
如何遵循命令?
net start "<service name>"
net stop "<service name>"
用于控制服务的程序选项:
StartService
方法。这对于需要执行其他处理(例如选择哪个服务)的情况很有用。Start-Service
通过RunspaceInvoke
或通过创建自己的Runspace
并使用其CreatePipeline
方法执行来执行。这对于需要能够以比WMI更简单的编码模型执行其他处理(例如,选择哪个服务)的情况很有用,但取决于安装的PSH。ServiceController
使用ServiceController从代码启动服务。
更新:从命令行启动服务的更正确方法是使用“ sc”(服务控制器)命令而不是“ net”。
尽管严格按照已接受的答案进行操作,但我仍然无法启动该服务-安装过程中出现一条失败消息,提示我无法启动刚刚安装的服务,因为即使使用了该服务,该服务也不存在 this.serviceInstaller.ServiceName
,而比文字...
我最终找到了一个使用命令行的替代解决方案:
private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e) {
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C sc start " + this.serviceInstaller.ServiceName;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
}
自动启动是指Windows启动时自动启动该服务。正如其他人提到的那样,要从控制台启动它,您应该使用ServiceController。
您可以使用ServiceController
类的GetServices
方法来获取所有服务的数组。然后,通过检查每个服务的属性来找到您的服务。找到服务后,请致电ServiceName
Start
方法以启动它。
您还应该Status
在调用start之前检查该属性以查看其已经处于什么状态(它可能正在运行,暂停,停止等)。
您破坏了设计师。重新添加您的安装程序组件。它应该具有serviceInstaller和serviceProcessInstaller。将属性“启动方法”设置为“自动”的serviceInstaller将在安装后以及每次重新启动后启动。