2009-07-17 31 views
0

当你创建一个Windwows服务时,你最终得到一个你需要注册的.exe文件,然后从“服务”管理单元启动它。.Net服务和Windows应用程序在同一时间?

如果您尝试执行此.exe文件,您会收到以下消息:“无法从命令行或调试器启动服务。必须首先安装Windows Service(使用installutil.exe),然后使用ServerExplorer启动, Windows服务管理工具或NET START命令。“

是否有可能在服务中设置某些东西,以便当作为常规.exe运行时,而不是显示此消息,它会执行一些我们可以在代码中控制的内容? (比如运行一个Sub Main()或类似的东西,显然是一个不同的入口点,而不是你在启动服务时获得的入口点)

谢谢!
Daniel

+0

您对“Sub Main()”的引用是否意味着您使用了VB?如果是这样,你可能想标记问题vb.net。 – CoderDennis 2009-07-17 19:11:30

+0

我使用VB,但我不认为这是特定于VB的。 – 2009-07-17 19:16:48

回答

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

您可以将您的应用程序作为单独的类库编写,然后创建一个stub exe来启动它?

+0

是的,我想到了这一点,这意味着至少有两个独立的项目。我想知道的是我是否可以仅使用一个项目来解决这个问题。 – 2009-07-17 19:02:01

0

您可以传入参数值。

像APP.EXE -UI或APP.EXE - 服务

2

我们倾向于建立我们的相似,弗朗西斯B.但使用条件编译:

#if DEBUG 
    Application.Run(new YourForm()) 
#else 
    ServiceBase[] ServicesToRun; 
    ServicesToRun = new ServiceBase[] 
    { 
     new YourService() 
    } 
    ServiceBase.Run(ServicesToRun); 
#endif 

这样可以很容易地测试和调试开发过程中,然后做一个构建部署服务。

我不确定您的问题是否希望它作为独立的exe发布,还是仅仅作为一种工具来帮助开发和测试。

请注意,顺便说一句,您不必在调试版本中包含“application.run()”块。如果它没有显示表单,那么在单独的线程中产生服务的OnStart处理程序时,任何执行无限循环的代码都可以。

相关问题