Windows服务 – 封装现有function

我们正在运行Winforms C#(.net framework 4.0)开发的客户端 – 服务器应用程序,它具有以下组件

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

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

首先让我来概述一下我们决定采取的方法

  1. 创build一个Windows服务项目(使用Windows服务项目模板)
  2. 将服务器function集成/封装到Windows服务中

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

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

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

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

预先感谢一吨

罗米

您可以将该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交互式运行,它像一个控制台,但可以安装在服务控制管理器。 也许类似的重构会帮助你的代码。

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

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

  • 在一个服务中, Environment.UserInteractive标志将是False 。 您可以使用它来根据执行方式更改程序的行为。 (例如,登录到控制台而不是Windows事件日志。)
  • 该服务实际上不会有一个控制台 – 即,即使它是一个“控制台应用程序”,您也无法读取它。
  • 使用ServiceBase.Run()启动ServiceBase.Run() ,必须包含服务安装程序组件 ,并使用installutil或“自行安装”进行安装 。

我会做的是创建服务器作为服务项目,遵循文档中的样板 :

 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进行调试。

在dll项目中转换服务器代码,然后将该dll的引用添加到windows服务项目并在那里使用它将是个好主意。

但是,在.net中使用可执行项目的引用到另一个项目是非常可能的。

演练:在组件设计器中创建Windows服务应用程序