2014-01-24 48 views
1

我们正在运行中的WinForms C#(.NET框架4.0)开发的客户端 - 服务器应用程序,它具有以下部件Windows服务 - 封装现有的功能

  1. 客户端(Windows应用程序)
  2. 服务器(控制台应用程序)

我们正在研究实现服务器(控制台应用程序)作为Windows服务的可能性。

让我先大概介绍一下决定采取

  1. 创建一个Windows服务项目(使用Windows服务项目模板)
  2. 集成/封装服务器功能集成到Windows服务
的方法

只有一个我们需要答案的问题。这里的尝试是尽可能客观地提出这个问题,以便将它归类为一个真正的问题。

我们是否需要将服务器转换为dll项目?

或者我们可以在Windows服务项目中引用服务器exe文件吗?

我个人认为第二种选择是不可能的。但我想知道我是否错过了一些东西。

在此先感谢

罗米

回答

2

您可以将exe作为参考添加到您的服务项目中。无论如何,Exe只是一个程序集。也许你必须设置为公开一些类,但如果你创建一个DLL也会发生。 我通常使用另一个技巧。 我从一个服务项目开始,我改变它表现为一个控制台应用程序:

属性 - >应用程序 - >输出类型:控制台应用程序

然后我写这样的事情在主:

 if (Environment.UserInteractive) 
     { 
      log.Info("Starting as a console..."); 
      // call my service runner 
     } 
     else{ 
       log.Info("Starting as a service..."); 
      log.Info(this.ServiceDisplayName); 
      log.Info(this.ServiceDescription); 
      ServiceBase[] servicesToRun = new ServiceBase[] 
      { 
       new MyServiceImpl(); 
      }; 
      try 
      { 
       ServiceBase.Run(servicesToRun); 
      } 
      catch (Exception e) 
      { 
       log.Fatal("A fatal error occurred while running.", e); 
       throw; 
      } 
     } 

有了这个策略,我有一个exe,交互式运行时,它的行为像一个控制台,但可以安装在服务控制管理器中。 也许类似的重构会帮助你的代码。

+0

好吧我是新创建的Windows服务。但是我对运行与服务或控制台应用程序相同的程序集感兴趣。问题是,当我创建一个类型为Windows服务的项目时,我无法从命令提示符或VS IDE运行该项目。我得到的错误信息是程序集应该由SCM执行(单词为效果) – Romi24

+0

是的,你必须改变主显示。当你有Environment.UserInteractive DONT调用ServiceBase.Run但实例化你的服务类,并通过调用OnSTart代码使其运行。 –

+0

因此,我使用Environment.UserInteractive属性的事实将使我有机会运行它作为服务或控制台应用程序? – Romi24

1

控制台应用程序一吨可以被引用就像一个DLL,您可以使用它包含的公共类。

1

。基于.NET的Windows服务本身并不特别。您可以为两者使用相同的基于控制台的应用程序项目。主要区别是:

我会做的就是创建一个服务器作为服务项目,以下the boilerplate in the docs

class MyServer : ServiceBase 
{ 
    protected override void OnStart(string[] args) 
    { 
     // OnStart() MUST return, so spawn off a thread here 
    } 
    public void MyStart(string[] args) 
    { 
     OnStart(args); 
    }   
} 

你必须在项目属性来更改项目类型为“控制台应用程序”。服务应用程序模板的默认值是“Windows应用程序”,但似乎并不重要。除了你应该通过安装它来调试服务的部分,启动它,然后连接一个远程调试器。谢谢邪神这是不必要的,当你:

启动它基于Environment.UserInteractive合适:

public static void Main(string[] args) 
{ 
    if (Environment.UserInteractive) 
    { 
     new MyServer().Start(args); 
    } 
    else 
    { 
     ServiceBase.Run(new ServiceBase[] { new MyServer() }); 
    } 
} 

这样你能够在独立模式下运行的Windows服务,可以使用F5进行调试。

+0

非常感谢您的答案。这非常有帮助 – Romi24