【问题标题】:.Net Service and Windows App at the same time?.Net 服务和 Windows 应用程序同时?
【发布时间】:2009-07-17 18:56:32
【问题描述】:

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

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

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

谢谢!
丹尼尔

【问题讨论】:

  • 您对“Sub Main()”的引用是否意味着您使用的是 VB?如果是这样,您可能需要标记问题 vb.net。
  • 我正在使用 VB,但我认为这根本不是 VB 特有的。

标签: .net .net-2.0 service


【解决方案1】:

这是可能的,但我不确定这是一个很好的解决方案:

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())
    }
}

我没有测试它,但我想它会起作用。

【讨论】:

    【解决方案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 处理程序时执行无限循环的任何代码都可以。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,我想到了,这意味着至少有 2 个独立的项目。我想知道的是我是否可以只使用一个项目来解决这个问题。
      • 单独的 EXE 确实是去这里的方式。 . .
      【解决方案4】:

      你可以传入一个 arg 值。

      类似于 app.exe -UI 或 app.exe -Service 的东西

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-13
        • 2014-02-03
        • 2011-12-07
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 2010-12-29
        相关资源
        最近更新 更多