我目前正在为可以在控制台中运行的服务编写一些引导程序代码。从本质上讲,它归结为调用OnStart()方法,而不是使用ServiceBase来启动和停止服务(因为如果未将其作为服务安装,则它不会运行该应用程序,并且会使调试成为噩梦)。
现在,我正在使用Debugger.IsAttached确定是否应该使用ServiceBase.Run或[service] .OnStart,但是我知道这不是最好的主意,因为有时最终用户希望在控制台中运行该服务(以查看输出等)。
关于如何确定Windows服务控制器是否在控制台中启动“我”或用户是否在控制台中启动“我”的任何想法?显然,Environment.IsUserInteractive不是答案。我考虑过使用命令行参数,但这似乎“肮脏”。
我总是可以看到围绕ServiceBase.Run的try-catch语句,但这似乎很脏。编辑:尝试捕获不起作用。
我有一个解决方案:将其放置在这里,供所有其他感兴趣的堆叠器使用:
public void Run()
{
if (Debugger.IsAttached || Environment.GetCommandLineArgs().Contains<string>("-console"))
{
RunAllServices();
}
else
{
try
{
string temp = Console.Title;
ServiceBase.Run((ServiceBase[])ComponentsToRun);
}
catch
{
RunAllServices();
}
}
} // void Run
private void RunAllServices()
{
foreach (ConsoleService component in ComponentsToRun)
{
component.Start();
}
WaitForCTRLC();
foreach (ConsoleService component in ComponentsToRun)
{
component.Stop();
}
}
编辑:在StackOverflow上还有另一个问题,那里的人与Environment.CurrentDirectory是“ C:\ Windows \ System32”的问题看起来可能是答案。我今天要测试。
宝慕林4294392
江户川乱折腾