创建Windwows服务时,最终会得到一个需要注册的.exe文件,并从“服务”管理单元启动它。
如果您尝试执行此.exe文件,则会收到消息:“无法从命令行或调试程序启动服务。必须首先安装Windows服务(使用installutil.exe),然后使用ServerExplorer启动Windows服务管理工具或NET START命令。“
是否有可能在服务中设置某些内容,以便在作为常规.exe运行时,而不是显示此消息,它将执行我们可以在代码中控制的内容? (比如运行Sub Main()或类似的东西,这显然是一个不同于你作为服务启动它时得到的入口点)
谢谢!
丹尼尔
答案 0 :(得分:4)
嗯有可能,但我不确定这是一个很好的解决方案:
static void Main()
{
bool your_condition = ReadRegistry or ReadConfigurationFile;
if(your_condition)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new YourService()
}
ServiceBase.Run(ServicesToRun);
}
else
{
Application.Run(new YourForm())
}
}
我没有测试它,但我想它会起作用。
答案 1 :(得分:2)
我们倾向于构建我们的类似于Francis B.但使用条件编译:
#if DEBUG
Application.Run(new YourForm())
#else
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new YourService()
}
ServiceBase.Run(ServicesToRun);
#endif
这样,在开发过程中很容易进行测试和调试,然后将构建部署作为服务进行。
我不确定您的问题是否希望它实际上作为独立的exe发布,或者只是作为辅助开发和测试的工具。
顺便说一句,请注意,调试版本中不必有“application.run()”块。如果它没有显示表单,那么在单独的线程中生成服务的OnStart处理程序时执行无限循环的任何代码都可以。
答案 2 :(得分:1)
您可以将应用程序编写为单独的类库,然后创建一个存根exe来启动它吗?
答案 3 :(得分:0)
您可以传入一个arg值。
app.exe -UI或app.exe -Service
之类的东西