.Net服务和Windows应用程序同时?

时间:2009-07-17 18:56:33

标签: .net .net-2.0 service

创建Windwows服务时,最终会得到一个需要注册的.exe文件,并从“服务”管理单元启动它。

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

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

谢谢!
丹尼尔

4 个答案:

答案 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

之类的东西