如何制作Windows服务应用程序,使其也可以作为独立程序运行?我将从一个示例开始:ApacheWeb服务器(在Windows下)有一个很好的特性:它可以作为独立应用程序运行(具有当前用户权限),也可以作为Windows服务直接安装和运行(作为本地系统帐户),使用相同的可执行文件为了使应用程序作为独立应用程序运行,它需要做的就是在某些公共类中使用静态公共Main()。为了让应用程序作为服务安装和运行,它必须以某种方式实现ServiceBase和Installer类。但是,如果像这样的应用程序作为独立应用程序运行,它将显示消息框。如何实现这种类Apache的运行方式?我确定解决方案很简单,但我真的不知道从哪里开始。下面的代码片段用于调用该服务。是否可以对其进行修改以允许独立使用?staticclassProgram{//////应用程序的主要入口点。///staticvoidMain(){ServiceBase[]ServicesToRun;ServicesToRun=newServiceBase[]{newService()//在别处定义为Service:ServiceBase};ServiceBase.Run(ServicesToRun);我选择的语言是C#。编辑:目前,我已经将通用代码抽象为一个单独的程序集(我们称之为Library.dll)并且我有两个可执行文件:Console.exe和Service.exe,它们分别是独立应用程序和Windows服务应用程序,两者都只是为了调用Library.dll。我的目标是将这两个可执行文件合并为一个,它仍然会调用Library.dll。在C#中,一种简单的方法是要求命令行参数将其作为服务运行。如果该参数不存在,则运行表单/控制台应用程序。然后让您的安装程序在安装服务时在可执行路径中包含参数,因此它看起来像这样:C:MyAppMyApp.exe-service它看起来像这样:staticvoidMain(string[]args){foreach(stringarginargs){//如果我们的参数存在,则作为服务运行if(arg.ToLower()=="-service"){ServiceBase[]servicesToRun=newServiceBase[]{newService1()};ServiceBase.Run(servicesToRun);返回;}}//如果参数不存在,则运行主窗体,例如当用户从资源管理器打开应用程序时。应用程序运行(新Form1());这只是一个给你的想法的例子,可能有更简洁的方法来编写这段代码。经过一些挖掘,我终于查看了.NET引擎盖(System.ServiceProcess.ServiceBase.Run方法)并发现它检查Environment.UserInteractivebool以确保可执行文件没有以交互方式运行。对我有用的过于简化的解决方案:classProgram{staticvoidMain(string[]args){if(!Environment.UserInteractive){ServicesToRun=newServiceBase[]{//Service.OnStart()创建MainLib()的实例//然后调用它的MainLib.Start()方法newService()};ServiceBase.Run(ServicesToRun);返回;}//在控制台窗口中运行MainLiblib=newMainLib();lib.Start();//...}}你应该抽象你的库中的所有功能。它恰好是从Windows服务运行的事实并不重要。事实上,如果您有一个名为ServiceFrontEnd的面向类,它具有Start()和Stop()-Windows服务应用程序可以调用它,命令行应用程序、Windows应用程序或其他任何应用程序也可以调用它。你在这里描述的只是需要更多的抽象。“服务”的功能不需要与Windows服务的运行方式紧密耦合。希望对您有所帮助通过您网站上的示例,我非常有信心Apache应用程序是用C或C++编写的。为此,您需要一个ServiceMain函数。如果你像普通程序一样执行它,那么main就会被调用。如果服务控制管理器指向它,则调用ServiceMain。不能说我了解C#。如果我必须用C#编写服务,我想我会从这里开始-http://msdn.microsoft.com/en-us/library/bb483064.aspx以上是C#学习教程:如何制作Windows服务应用程序,以便它也可以作为独立程序运行?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
