답변:
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 문 으로 감싸는 것도 나쁘지 않습니다 .
ServiceInstaller
클래스 의 변수 여야합니다 . 이러한 클래스는 System.Configuration.Install.Installer
. 자세한 내용은이 msdn 가이드 를 참조하십시오.
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
다음 명령 줄을 사용하여 서비스를 시작할 수 있습니다.
net start *servicename*
ServiceController 를 사용 하여 코드에서 서비스를 시작하십시오.
업데이트 : 명령 줄에서 서비스를 시작하는보다 정확한 방법 은 "net"대신 "sc"( 서비스 컨트롤러 ) 명령을 사용하는 것입니다.
정확히 허용 대답을 다음에도 불구하고, 나는 아직도 대신이 존재하지 않는 것처럼 방금 설치 한 서비스 사용에도 불구하고, 시작할 수 없다는 설치하는 동안 오류 메시지가 주어진 I를 start-- 할 수있는 서비스를받을 수 없습니다 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.ServiceName을 "name from designer".ServiceName으로 바꾸십시오.
이 경우 개인 구성원도 필요하지 않습니다.
도와 주셔서 감사합니다.