用于创建Windows服务的最简单语言

时间:2009-02-27 03:56:14

标签: windows-services

构建Windows服务最简单的语言是什么?

在这种情况下最简单的定义为最少的代码量和最低的语言输入点。

6 个答案:

答案 0 :(得分:176)

冒着明显的风险,如果你有任何C / C ++ / Java背景,我认为C#为你提供了最低的入口点。

假设您使用的是Visual Studio 2008,则可以按照以下步骤操作:

  1. 打开Visual Studio 2008,然后选择“文件”|“新建”|“项目”菜单选项。
  2. 在“新建项目”对话框中...
    • 在项目类型
    • 中选择Visual C#| Windows节点
    • 选择Windows服务模板
    • 输入项目的名称和位置
    • 按OK
  3. 此时,您拥有Windows服务的所有基础知识。 Program.cs文件包含服务的Main()方法,Service1.cs定义了作为新Windows服务的System.ServiceProcess.ServiceBase组件。
  4. 在Service1组件的Property Grid中,请考虑至少设置以下属性:
    • (名称) - 为您的对象提供直观的名称,例如ServiceExample
    • AutoLog - 设置为false以防止事件默认写入应用程序事件日志(注意:我不是说您不应该记录服务事件;我只是想写入我自己的事件日志而不是应用程序日志 - 见下文)
    • CanShutdown - 如果要处理系统关闭,请设置为true
    • ServiceName - 定义服务控制管理器(SCM)知道服务的名称
  5. 在ServiceExample的代码中,OnStart()和OnStop()虚函数被删除。您需要填写这些内容,无论您的服务需要做什么。如果您将CanShutdown属性更改为true,则还需要覆盖OnShutdown方法。我在下面创建了一个示例,说明了这些函数的用法。
  6. 此时,ServiceExample服务基本上已完成,但您仍需要一种方法来安装它。为此,请在设计器中打开ServiceExample组件。右键单击设计器面板中的任意位置,然后选择“添加安装程序”菜单选项。这会将ProjectInstaller组件添加到项目中,该组件包含两个附加组件 - serviceProcessInstaller1和serviceInstaller1。
  7. 在设计器中选择serviceProcessInstaller1组件。在Property Grid中,考虑设置以下属性:
    • (名称) - 为您的对象提供直观的名称,例如serviceProcessInstaller
    • 帐户 - 至少选择LocalService帐户,但如果您的服务需要更多权限,则可能必须使用NetworkService或LocalSystem帐户
  8. 在设计器中选择serviceInstaller1组件。在Property Grid中,考虑设置以下属性:
    • (名称) - 为对象提供直观的名称,例如serviceInstaller
    • 说明 - 将在SCM中显示的服务说明
    • DisplayName - 您的服务的友好名称,该名称将显示在您的服务的SCM中
    • ServiceName - 确保这与您为ServiceExample组件的ServiceName属性选择的名称相同(请参阅步骤4)
    • StartType - 指示您是希望自动或手动启动服务
  9. 请记住,我说我更喜欢将事件写入我自己的事件日志而不是应用程序事件日志。为此,您需要使用自定义项替换ProjectInstaller中的默认EventLogInstaller。使ProjectInstaller的代码如下所示:

  10. using System.Diagnostics;
    [RunInstaller(true)]
    public partial class ProjectInstaller : Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();
    
            EventLogInstaller installer = FindInstaller(this.Installers);
            if (installer != null)
            {
                installer.Log = "ServiceExample"; // enter your event log name here
            }
        }
    
        private EventLogInstaller FindInstaller(InstallerCollection installers)
        {
            foreach (Installer installer in installers)
            {
                if (installer is EventLogInstaller)
                {
                    return (EventLogInstaller)installer;
                }
    
                EventLogInstaller eventLogInstaller = FindInstaller(installer.Installers);
                if (eventLogInstaller != null)
                {
                    return eventLogInstaller;
                }
            }
            return null;
        }
    }
    

    此时,您可以构建项目以获取Windows服务可执行文件。要安装服务,请打开Visual Studio 2008命令提示符,然后导航到可执行文件所在的Debug或Release目录。在命令提示符下,键入以下内容: InstallUtil ServiceExample.exe 。这将在本地计算机上安装您的服务。要卸载它,请在命令提示符下键入以下内容: InstallUtil / u ServiceExample.exe

    只要您的服务未运行,您就可以对服务进行更改并重新构建,即您不必卸载服务即可对其进行更改。但是,只要它正在运行,您将无法使用修复程序和增强功能覆盖可执行文件。

    要查看您的服务,请打开ServiceExample.cs文件并进行以下更改:

    using System.Diagnostics;
    public partial class ServiceExample : ServiceBase
    {
        public ServiceExample()
        {
            // Uncomment this line to debug the service.
            //Debugger.Break();
    
            InitializeComponent();
    
            // Ties the EventLog member of the ServiceBase base class to the
            // ServiceExample event log created when the service was installed.
            EventLog.Log = "ServiceExample";
        }
    
        protected override void OnStart(string[] args)
        {
            EventLog.WriteEntry("The service was started successfully.", EventLogEntryType.Information);
        }
    
        protected override void OnStop()
        {
            EventLog.WriteEntry("The service was stopped successfully.", EventLogEntryType.Information);
        }
    
        protected override void OnShutdown()
        {
            EventLog.WriteEntry("The service was shutdown successfully", EventLogEntryType.Information);
        }
    }
    

    使用这些更改运行服务后,您可以在事件查看器中查看ServiceExample事件日志,并查看其中记录的消息。

    希望这有帮助。

    编辑:如果您希望将事件日志记录用于事件日志记录而不是自定义事件日志,则只需对ProjectInstaller.cs文件不进行任何更改。此外,省略在ServiceExample构造函数中设置EventLog的Log属性的行。运行服务时,日志消息将显示在应用程序事件日志中。

答案 1 :(得分:4)

我同意在其他地方做出回应的所有人,但我会说不要过分关注实际的语言,只要你在.NET框架中工作,并且有一个启动项目,你'好好去。我以前做过几个“Windows服务”,用VB.NET和C#开发它们,代码很少。

我建议OP做的是学习如何为它构建安装程序包。安装服务就像执行“installutil.exe {drive} \ path \ to \ file.exe”一样简单,但是当你必须做大于部署“hello world”Windows服务的任何事情时,最好知道并理解以有意义的方式部署服务。

不要开始一场火焰战,但我已经“标准化”使用WiX用于我所有的部署包,除了做老式的COM互操作类型的东西,因为这是工作的首要任务正确安装。我急于让WiX团队开发引导程序,允许您将先决条件和主要msi放入可下载的EXE文件中。他们预定它为3.5,所以我耐心等待,现在使用WinZip Self-Extracting可执行文件。

答案 2 :(得分:0)

对我而言,我只尝试了几种方式,Visual Studio和C#是最简单的。

Visual Studio为框架完成了所有必要的服务管道设置,我发现C#非常容易学习,从VB6,VB.NET和C迁移。

答案 3 :(得分:0)

使用Visual C#,您可以在网上找到最多的代码示例。 结合Visual Studio,它是在公园散步,以启动和运行基本的Windows服务。 Visual Studio还可以轻松创建MSI安装程序包。

那将是我的选择

答案 4 :(得分:0)

使用Visual Studio服务类型项目,使用C#或VB.NET。

我个人更喜欢C#,但总的来说,很容易理解生命周期并在理想的阶段对逻辑进行编码。

构建安装程序也非常简单。

答案 5 :(得分:0)

C#中的Windows服务项目将通过单击按钮从Visual Studio模板为您提供完全可部署的服务。您只需添加有效负载代码。