我们正在运行Winforms C#(.net framework 4.0)开发的客户端 – 服务器应用程序,它具有以下组件
我们正在研究实现服务器(控制台应用程序)作为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服务应用程序