Windows服务 – 封装现有function

Windows服务 – 封装现有function,第1张

概述Windows服务封装现有function

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

客户端(windows应用程序)

服务器(控制台应用)

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

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

创build一个windows服务项目(使用windows服务项目模板)

将服务器function集成/封装到windows服务中

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

windows 8是否支持System.Device.Location?

单声道,asp.net c#和MVC如何和教程

.Net使用特殊文件夹符号

WinForm:与VS2010中的现有菜单合并ContextMenuStrip MenuItem

64位版本的windows SDK中的Fxcop在哪里?

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

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

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

预先感谢一吨

罗米

如何启用/禁用防火墙?

.Net和Hadoop – 知道/学习什么和可用的?

windows应用程序Java Servletparameter passing

任何方式立即触发WaitOne()的超时?

win32 API是否过时了?

您可以将该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服务应用程序

总结

以上是内存溢出为你收集整理的Windows服务 – 封装现有function全部内容,希望文章能够帮你解决Windows服务 – 封装现有function所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1282369.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存