为什么Windows服务不调用OnStart方法?

2023-12-14

我创建了一个 Windows 服务应用程序,其中包含OnStart方法。该方法将从中读取路径应用程序配置文件,创建一个对象,然后服务写入该对象的重写ToString()方法到一个文件StreamWriter.

当我使用“手动启动此服务”时,这是有效的净启动“。 所以OnStart方法被调用,对象被创建并写入其ToString方法到一个文件。

我将其设置为 Windows 启动时自动运行的服务。 我的问题是,这OnStartWindows 启动服务后不会调用该方法。所以我认为当 Windows 在启动时开始运行服务时,它会启动我的服务,只是不调用OnStart method.

有人有同样的问题或者有人有解决方案吗?

启动方法:

protected override void OnStart(string[] args)
    {
        filePath = configReader.ReadConfig("FilePath");
        DateEvent dateEvent = new DateEvent(DateTime.Now, TimeLoggerCore.Events.STARTUP.ToString());
        writer.WriteToFile(dateEvent, filePath, true, false);
    }

构造函数:

public TimeLoggerService()
    {
        InitializeComponent();
        configReader = new AppConfigReader();
        writer = new CSVWriter();
    }

程序.cs:

static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new TimeLoggerService()
        };
        ServiceBase.Run(ServicesToRun);
    }

由于当您尝试使用以下命令从命令行启动服务时,您的服务就会启动net.exe start [ServiceName]但windows启动时无法启动,可能是启动时遇到异常。

构建和使用自定义 Windows 服务时需要注意的一件重要事情是,Windows 事件日志对于跟踪问题非常有帮助。当服务中发生错误时,值得在事件日志中记录该错误。

在 Visual Studio 中调试正在运行的服务的另一个有用方法是启动服务,然后将 VS 调试器附加到它。

要让一些 Windows 事件日志记录到您的服务中,我建议修改您的服务的代码以记录其启动。请注意,我在这里发布的内容是针对该论坛进行简化的 - 我通常将所有日志记录代码放入单独的类中。这样我就可以在整个服务生命周期中使用它。一个重要的注意事项 - 请务必设置ServiceName具有适当名称的主服务类的属性 - 这应该在设计时在 Visual Studio 中在服务设计器的“属性”窗口中完成。

private EventLog _eventLog;

/*
 * Use the EventId enumeration to store event IDs that will be written with events
 * to the Windows event log.
 */
enum EventId  
{
    ServiceStarting = 10,
    ServiceStartNormal = 100,
    ServiceStartFailure = 999;
}

protected override void OnStart(string[] args)
{
    try
    {
        // remember the event log
        _eventLog = EventLog;

        // log start
        LogMessage(_eventLog, "Service starting", EventLogEntryType.Information, EventId.ServiceStarting);

        filePath = configReader.ReadConfig("FilePath");
        DateEvent dateEvent = new DateEvent(DateTime.Now, TimeLoggerCore.Events.STARTUP.ToString());
        writer.WriteToFile(dateEvent, filePath, true, false);

        LogMessage(_eventLog, "Service started", EventLogEntryType.Information, EventId.ServiceStartNormal);
    }
    catch(Exception e)
    {
        LogMessage(_eventLog, e.ToString(), EventLogEntryType.Error, EventId.ServiceStartFailure);
    }
}

private static void LogMessage(EventLog eventLog, string message, EventLogEntryType entryType, EventId eventId)
{
    /*
     * If the event source we want to log doesn't exist, create it.
     * Note that this take admin privs, and creating the log source should be
     * done during service installation.  This is here as a secondary means
     * to create the log in the event that it doesn't already exist.
     */
    if (!EventLog.SourceExists(eventLog.Source)
    {
        EventLog.CreateEventSource(eventLog.Source, eventLog.Log);
    }
    eventLog.WriteEntry(message, entryType, (int) eventId);
}

将此代码添加到您的服务后,重新部署它,重新启动系统,然后检查事件日志。至少您应该在服务启动时看到一条记录的消息。

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

为什么Windows服务不调用OnStart方法? 的相关文章

  • 错误:“运行所选代码生成器时出错:包恢复失败”

    我正在尝试将控制器添加到 ASP NET Core 项目中的解决方案中 当我尝试这样做时 我收到此错误 我收到相同的消息 为控制器添加最小依赖项和完整依赖项 我也有这个问题 使用实体框架添加控制器 gt 带有操作的 API 控制器 将给出
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • 为什么 ObservableCollection 有两个集合构造函数?

    The 可观察集合 T https msdn microsoft com en us library ms668604类有两个构造函数 可以在其中传递项目集合 一个构造函数接受一个IEnumerable T 另一个List T 鉴于List
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • 多选DataGridView没有CTRL键没有闪烁?

    我在表单 Form1 vb 上有一个 DataGridView 控件 需要允许用户在不使用 CTRL 键的情况下多选行 没有可用的键盘 他们使用触摸屏 我已启用 mutliselect 属性 并在 Form 类中包含以下代码 我的 Data
  • 为什么我收到编译错误“使用已删除的函数 'std::unique_ptr ...”

    我收到一条巨大的编译错误消息 c mingw include c 6 1 0 bits predefined ops h 123 18 error use of deleted function std unique ptr lt Tp D
  • JNA Windows 服务启动类型

    我一直在使用 JNA 并且能够使用下面的代码返回 Windows 服务的状态 即启动或停止 但我不确定如何返回服务的启动类型 我确信 JNA 之外还有其他方法 但如果可能的话我想继续使用 JNA import com sun jna imp
  • 将旧的 Unity 代码升级到 Unity 5

    在触发按钮上播放动画的代码似乎不起作用 我在 Youtube 上看到了一个视频 内容很简单animation Play 它可以在该视频上运行 但我无法让它在我的计算机上运行 我做错了什么还是团结改变了它 请帮助我在网上找不到解决方案 所有
  • 解析连接字符串

    是否有标准库或代码片段可以使用这样的连接字符串获取值 string connstr DataServiceUrl http localhost foo RemoteServerConnection server http localhost
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • 在链表程序中使用模板时重载 C++ 中的 << 运算符

    我正在尝试实现一个链接列表 但是当我尝试重载 include
  • C++ 在预处理器 #if 中对 sizeof() 比较抛出编译错误

    我有这个 它不会从 Visual Studio 编译错误 致命错误 C1017 无效的整数常量表达式 我该怎么做 template
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • 如何从 C# 中的 Web Api 方法正确获取字节数组?

    我有以下控制器方法 HttpPost Route SomeRoute public byte MyMethod FromBody string ID byte mybytearray db getmybytearray ID working
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720

随机推荐