创建 Windows 服务的最简单语言

2023-12-28

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

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


冒着陈述显而易见的风险,如果您有任何 C/C++/Java 背景,我认为 C# 为您提供了最低的切入点。

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

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

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 命令提示符,然后导航到可执行文件所在的“调试”或“发布”目录。在命令提示符处,键入以下内容: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 属性的行。当您运行服务时,您的日志消息将显示在应用程序事件日志中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建 Windows 服务的最简单语言 的相关文章

  • 安装时自动启动 Windows 服务

    我有一个使用 InstallUtil exe 安装的 Windows 服务 即使我已将启动方法设置为自动 但该服务在安装时并未启动 我必须手动打开服务并单击启动 有没有办法通过命令行或通过服务代码启动它 在 Installer 类中 添加
  • 从窗口服务显示窗口窗体

    我正在创建一个窗口服务 我的要求是按特定时间间隔显示 Windows NT 服务的窗口窗体 出于测试目的 我只想在服务启动时显示表单 protected override void OnStart string args eventLog1
  • 如何解决 CoUnitialize() 上挂起的进程?

    我有一个本机 Visual C NT 服务 当服务启动时 它的线程调用CoInitialize 它将线程附加到 STA 服务线程通过 COM 接口使用 MSXML 当服务接收到SERVICE CONTROL STOP它在消息队列中发布一条消
  • Windows 服务 + Windows 窗体应用程序。一个数据库。关于并发的建议

    我有包含文件信息的 SQL Server 数据库 我正在谈论自定义属性 这些是每个文件的类别和描述 Windows 窗体应用程序是供用户使用的 但我还将创建一个 Windows 服务来跟踪文件的任何更改 如果发生更改 重命名 移动 删除 服
  • 在 C# windows 服务中捕获键盘事件

    我用 C 创建了一个 Windows 服务 如何在按下某个键时调用一个函数 并在该函数中获取该键的值 我需要它来按下键和按下键 我的目标是在按下特定系列的键时发送电子邮件 例如 如果您按 h e l l o 无论您在桌面上的哪个位置键入 程
  • 在 Windows 7 中安装/卸载服务:“错误 1001。指定的服务已标记为删除”

    我目前正在 NET 4 0 Visual Studio 2010 Windows 7 32 位中开发 Windows 服务 我有一个安装程序项目可以为我进行安装 当我安装该服务 卸载它并尝试再次安装时 出现以下错误 错误1001 指定的服务
  • 使用 Windows 服务手动实现 IoC

    我是 IoC 的新手 因此一直在遵循 Jeffery Palermo 在他的帖子中提供的示例http jeffreypalermo com blog the onion architecture part 1 http jeffreypal
  • 使用 NSSM 将 NodeJs 进程作为 Windows 服务启动不起作用

    我看过无数关于如何使用 NSSM 的文章 http nssm cc http nssm cc 启动 NodeJS 进程 所以 我有以下简单的 NodeJS 文件 var http require http http createServer
  • 如何使用 WiX 安装和启动 Windows 服务

    我尝试在 Wix 中使用下面的代码 但是在安装时 安装程 序在 正在启动服务 状态下冻结了大约 3 分钟 然后我收到此消息 Service Jobservice 无法启动 请验证您是否有足够的权限来启动系统服务 我的代码有什么错误吗 并且可
  • 如何以编程方式获取服务的状态(正在运行/已停止)

    我需要在我的 C 应用程序中获取 Windows 打印后台处理程序 服务的状态 shikarssj提供的功能运行良好 加载服务时只需要管理员权限 这是一个不需要完全许可的版本 include
  • 长时间运行进程的超时和 Windows 服务 (Python)

    我有一个使用 python 创建的简单 Windows 服务 我的问题是 我不知道该服务需要多长时间才能完成 可能需要 15 秒 也可能需要 4 个多小时 具体取决于需要对数据执行的操作 4个多小时的情况很少见 但我也遇到过这种情况 以下是
  • 调试Windows服务

    Scenario 我有一个用 C 编写的 Windows 服务 我已经阅读了所有关于如何调试它的谷歌线程 但我仍然无法让它工作 我已经运行 PathTo NetFramework InstallUtil exe C MyService ex
  • 本地计算机上的服务启动然后停止,某些服务如果没有被其他服务或程序使用则自动停止

    我创建了一个示例 Windows 服务并成功安装了我的服务 但是在要启动服务时 我收到以下错误 本地计算机上的此服务启动然后停止 如果其他服务或程序未使用某些服务 则会自动停止 我的配置文件代码
  • Excel 2013 COM API 在服务帐户下挂起 ExportAsFixedFormat

    我有一个 NET Windows 服务 它调用 Excel 2013 COM API 以在 PDF 上导出 Excel 文档 我已尝试使用在两个不同域帐户下运行的 Windows 服务来执行此代码 这两个帐户都是运行代码的计算机上的本地管理
  • 通过服务删除 Windows 登录屏幕

    我正在尝试从服务启动的可执行文件中删除 Windows 登录屏幕 winlogon 该服务将随 Windows 自动启动 并等待来自另一台计算机的命令 当它收到命令时 它将启动一个 exe 该 exe 将在特定用户名下启动 cmd exe
  • 登录方式使用GINA定制

    我知道在 GINA 中找到大师并不容易 但我的问题最接近进程间通信 IPC 我用非托管 c 编写了我的自定义 GINA 我在其中包含了一个方法来检查用户尝试的指纹的有效性为了登录 该函数将调用正在运行的系统Windows服务中用C 编写的一
  • 用 C# 启动 Windows 服务

    我想启动一个刚刚安装的Windows服务 ServiceBase ServicesToRun if bool Parse System Configuration ConfigurationManager AppSettings RunSe
  • 安装 Windows 服务时的凭据

    我正在尝试使用 VisualStudio Net 部署项目安装 C Windows 服务项目 要运行部署项目 我右键单击并从上下文菜单中选择 安装 安装向导将运行并最终提示我出现 设置服务登录 对话框 要求输入用户名和密码 当我从命令行使用
  • 自动更新Windows服务[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我即将开发一个程序 该程序将作为 Windows 服务安装在多个客户端的后端服务器 可访问互联网 上并运行 我无法物理访问服务器 我正在研究的是
  • 以编程方式将 Windows 服务添加到 Windows 防火墙(在安装期间)[重复]

    这个问题在这里已经有答案了 可能的重复 以编程方式将应用程序添加到 Windows 防火墙 https stackoverflow com questions 113755 programmatically add an applicati

随机推荐

  • 在 android 8 中单击 OneSignal 通知后打开 android 应用程序有延迟

    我已经添加oneSignal库到我的android项目 一切都很顺利 除了当我单击从一个信号服务器收到的通知时 在我的设备上打开我的 Android 应用程序大约需要一两分钟 但模拟器工作正常 我的设备是 Galaxy s7 运行 Andr
  • Javascript 在新窗口中打印不会显示图像

    我正在努力解决一个问题 我希望你能帮助我 我创建了一个函数 可以打印页面中输入的数据 但是 我在打印页面上使用的徽标不会显示 就像图像的链接已损坏一样 有什么想法吗 这是代码 function printReport win null va
  • Scala:分隔延续解释 - 不

    对延续的概念感兴趣 我开始阅读维基 帖子 并找到了这个 简单 的例子 reset shift k Int gt Int gt the continuation k will be the 1 below k 7 1 result 8 如果不
  • 如何开始在 .NET 中创建应用程序 API

    在我工作的公司中 我们有一个用 NET 开发的桌面应用程序 我们希望为其他软件开发人员开放一些部分 我将其视为其他软件可以访问的某种公共方法 有没有这方面的标准方法 最佳实践或其他经验 我想你可以通过 Win32 调用 C C 编程等来做到
  • 如何/在哪里定义 AudioWorkletProcessor

    我刚刚开始使用 Web Audio API 我仔细阅读了 API 文档并看到了几个示例 我的问题可能很微不足道 而且我可能错过了一些基本的东西 我有下面的工作者 javascript 文件 它来自一个我放错了网址的示例 我正在使用 PyCh
  • R“图像”函数的意外转置翻转输出

    假设我有一个矩阵 m lt matrix 1 5 4 5 m 1 2 3 4 5 1 1 5 4 3 2 2 2 1 5 4 3 3 3 2 1 5 4 4 4 3 2 1 5 现在 当我这样做时 image m 我得到了意想不到的输出 所
  • Xamarin.Forms:Visual Studio 升级后的部署问题

    将 Visual Studio Professional 2019 升级到版本 16 9 2 后 当我尝试在 Android 模拟器上部署时 api 28 9 0 我收到以下错误 Error XA0130 Sorry Fast deploy
  • 如何处理看起来像SQL关键字的SQL列名?

    我的专栏之一叫做from 我无法更改名字 因为我没有成功 我可以做类似的事情吗SELECT from FROM TableName或者是否有特殊的语法来避免 SQL Server 被混淆 将列名称括在括号中 如下所示 from变成 来自 s
  • 使用 RDD 中的索引扫描 Spark 中的 Hadoop 数据库表

    那么如果数据库中有一张表如下所示 Key2 DateTimeAge AAA1 XXX XXX XXX AAA2 XXX XXX XXX AAA3 XXX XXX XXX AAA4 XXX XXX XXX AAA5 XXX XXX XXX A
  • 字典中一个键存储多个值

    我有一个数据列表 其中有 2 个值 a 12 a 11 a 5 a 12 a 11 我想使用字典 这样我就可以得到每个键的值列表 第 1 列可能有不同的条目 例如 b 所以我可以根据第1列作为键来排列数据 而第2列是每个键的数据 a 12
  • 为什么 Rails 中不推荐使用 auto_link?

    我意识到它已被拉入单独的宝石中 但原因是什么 这只是简化 Rails 的问题 还是有什么原因让我应该厌倦 auto link gem 说它的目的是 为人们迁移弥合差距 这对我来说意味着 如果我将 Rails autolink 引入到一个新项
  • iPhone 本地存储空间有限制吗?

    我想知道 iPhone 上 localstorage HTML 5 的限制是什么 我读到它大约是 5 Mb 但令我惊讶的是这么小 有任何想法吗 MobileiPhone 和 iPad 上的 Safari 在抛出错误之前将保留 5MBQUOT
  • 无法将队列添加到现有 TFS 2015 构建代理池

    升级到 TFS 2015 后尝试设置构建服务器 我设想的方式是 单代理池 将有 3 个队列 1 每晚构建 2 CI构建 3 门控 验证构建 他们每个人都会有一些代理 目标是进行一些控制 以确保夜间构建不会消耗所有代理 因此门控队列将始终有一
  • SVN合并重新整合缺失的范围但没有要合并的内容

    这是谜语 C code trunk gt svn merge reintegrate http svn e com repos branches lih accept postpone dry run svn E195016 Reinteg
  • PHP:如何查找字符串中 * 通配符的出现

    也许我问的问题有点太平庸了 但我真的不知道如何使用 PHP 检查字符串中是否出现通配符 字符 示例字符串 bcd OR ab d OR abc 无论我尝试使用什么 PHP 函数 它的行为都是不可预测的 我只需要知道通配符是否在字符串中 非常
  • 从 AsyncTask 管理 ProgressDialog 的最佳方法

    我想使用AsyncTask用于管理我的应用程序中的一些业务逻辑 使用的最佳模式是什么onProgressUpdate 的方法AsyncTask在单独的文件中定义 不是作为内部类Activity 我有两个想法 1 最简单的方式 创建Progr
  • 保护控制器除一个(登录)之外的所有操作的最佳方法是什么?

    目前我有 Authorize 我的所有方法的属性AdminController除了Logon action 什么是cleanest反转这个的方法 所以我不必记住向所有方法添加属性 而是仅向无需登录即可使用的方法添加属性 我会更好地移动Log
  • 为什么我在使用 MockMvc 和 JUnit 时收到错误 403?

    我有一个带有 spring security 3 2 的 spring mvc 3 2 5 应用程序 我用这个方法配置了我的 SecurityConfig class Override protected void configure Ht
  • 笔记本电脑触控板的 WM_INPUT 上的 RAWINPUTHEADER hDevice 为 null

    我使用原始输入来处理通用设备的输入 到目前为止 我的所有测试用例都有效 键盘 游戏板和鼠标 但我的笔记本电脑触控板给我带来了一个奇怪的问题 当我得到一个WM INPUT https learn microsoft com en us win
  • 创建 Windows 服务的最简单语言

    构建 Windows 服务最简单的语言是什么 在这种情况下 最简单的定义是最少的代码量和最低的语言入口点 冒着陈述显而易见的风险 如果您有任何 C C Java 背景 我认为 C 为您提供了最低的切入点 假设您使用的是 Visual Stu