my_*_*ack 4 c# windows-services .net-3.5
我在使用Windows服务时相当新,但我发现了一个特殊的事件,我想澄清一下.我有一个用C#编写的Windows服务,我安装并开始使用命令行(在stackoverflow上找到了很棒的指令).我服务的主要方法如下:
static void Main(string[] args)
{
if (args.Length == 0)
{
ServiceBase.Run(new MyServiceName());
}
else if (args.Length == 1)
{
const string name = "MyServiceName";
Type type = typeof(MyAssembly);
switch (args[0])
{
case "-install":
ServiceUtils.InstallService(name, type);
ServiceUtils.StartService(args, name);
break;
case "-uninstall":
ServiceUtils.StopService(name);
ServiceUtils.UninstallService(name, type);
break;
default:
throw new NotImplementedException();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我调试时,我总是向应用程序发送一个参数(-install).因此,第一个if语句(if (args.Length == 0)永远不会被执行.这是预期的,我的服务安装和启动就好了.但是,如果我删除if语句并只保留if (args.Length == 1)语句,我的服务安装正确,但它没有启动,我收到以下错误:
无法在计算机上启动MyServiceName'.'
我的问题是:为什么在我的应用程序中永远不执行第一个if语句中的代码?
这是InstallService和StartService方法的支持代码(我也从stackoverflow获得):
public static void InstallService(string serviceName, Type t)
{
if (IsInstalled(serviceName)) return;
try
{
Assembly a = t.Assembly;
using (AssemblyInstaller installer = GetInstaller(a))
{
IDictionary state = new Hashtable();
try
{
installer.Install(state);
installer.Commit(state);
}
catch
{
try
{
installer.Rollback(state);
}
catch
{ }
throw;
}
}
}
catch
{
throw;
}
}
public static void StartService(string[] args, string serviceName)
{
if (!IsInstalled(serviceName)) return;
Console.WriteLine("Service is installed. Attempting to start service.");
ServiceController sc = new ServiceController();
sc.ServiceName = serviceName;
if (sc.Status == ServiceControllerStatus.Stopped)
{
Console.WriteLine("Starting {0}: ", sc.ServiceName);
try
{
sc.Start(args);
sc.WaitForStatus(ServiceControllerStatus.Running);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
Run Code Online (Sandbox Code Playgroud)
第一个if语句(if(args.Length == 0)是从未执行过的
这是不正确的,它被执行.通过ServiceController.Start().您无法看到这一点,因为服务控制器再次启动EXE,从而创建另一个进程.这次是服务进程,而不是控制台进程.一个你没有附加调试器的.如果删除该if语句,则服务会在开始后立即退出.并且服务控制器通过"无法启动MyServiceName"异常消息正确地抱怨它.