【问题标题】:.Net Windows Service doesn't run.Net Windows 服务不运行
【发布时间】:2011-04-18 15:13:13
【问题描述】:

我正在开发一个可自行安装的 Windows 服务。我有一个处理安装/卸载的 ServiceManager 类,并且似乎工作正常。

但是,当我尝试运行启动服务时,立即会出现一个带有以下文本的 MessageBox:

无法在本地启动服务 系统。错误 1053:服务没有响应 中的启动或控制请求 及时的时尚。

我的服务代码:

public partial class MyService : ServiceBase
{
    public MyService()
    {
        using (TextWriter tw = new StreamWriter(path: "C:\\Test.txt", append: true))
        {
            tw.WriteLine("Test1");
            tw.Close();
        }
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {

        using (TextWriter tw = new StreamWriter(path: "C:\\Test.txt", append: true))
        {
            tw.WriteLine("Test2");
            tw.Close();
        }

        Thread t = new Thread(new ThreadStart(InitService));
        t.Start();
    }

    protected override void OnStop()
    {
    }

    static void InitService()
    {
        using (TextWriter tw = new StreamWriter(path: "C:\\Test.txt", append: true))
        {
            tw.WriteLine("Test4");
            tw.Close();
        }

        while (true)
        {
            Thread.Sleep(100);
        }
    }

设计器代码:

namespace MyService
{
    partial class MyService
    {
        /// <summary> 
        /// Variable del diseñador requerida.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Limpiar los recursos que se estén utilizando.
        /// </summary>
        /// <param name="disposing">true si los recursos administrados se deben eliminar; false en caso contrario, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Código generado por el Diseñador de componentes

        /// <summary> 
        /// Método necesario para admitir el Diseñador. No se puede modificar 
        /// el contenido del método con el editor de código.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
            this.ServiceName = "MyService";
        }

        #endregion
    }
}

我的主要:

public static void Main(string[] args)
{
    try
    {
        bool debug = false;
        bool mustRun = false;
        string errMsg = "";
        mustRun = true;

        using (TextWriter tw = new StreamWriter(path: "C:\\Test.txt", append: true))
        {
            tw.WriteLine("Test3");
            tw.Close();
        }

        ServiceManager manager = new ServiceManager();

        mustRun = !manager.ParseArgs(args, ref debug, ref errMsg);

        MyService svc = new MyService();

       //  
       //             if (debug)
       //             {
       //                 svc.DebugStart();
       //             } 
       //             else 
        if (mustRun)
        {
            System.ServiceProcess.ServiceBase[] ServicesToRun = null;
            ServicesToRun = new System.ServiceProcess.ServiceBase[] { svc };
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
        }
        else
        {
        }
    }
    catch (Exception ex)
    {
        using (TextWriter tw = new StreamWriter(path: "C:\\Test.txt", append: true))
        {
            tw.WriteLine(ex.Message);
            tw.Close();
        }
    }
}

不会写入文件 C:\Test.txt,除非在安装或卸载服务时(使用 Test3 字符串)。我使用的是 Windows XP,所以应该没有权限问题。

我尝试使用 System 和 NetworkService 帐户安装服务,但出现了同样的问题。

使用管理员帐户,它给了我另一个与帐户相关的错误(我猜是因为我没有密码)。

知道会发生什么吗?

更新:回答大卫的问题,这是事件日志所说的(手工翻译,英文信息可能不同):

服务无法启动。服务 进程无法连接到服务 控制器。

更新 2: 仔细查看应用程序日志,之前的错误是由于服务安装名称和设计器中的 ServiceName 属性不匹配造成的。它已经修好了;现在事件日志中没有新的错误,但问题仍然存在。

【问题讨论】:

  • 您检查了事件日志吗?通常当服务无法启动时,它会抛出一个错误,它会自动记录在“应用程序”事件日志中。这应该告诉你发生了什么。
  • @David:感谢您的提示,问题已更新。

标签: .net visual-studio-2010 windows-services windows-xp


【解决方案1】:

从外观上看,您需要启动运行服务的线程。

Thread t = new Thread(new ThreadStart(InitService));
t.Start();

【讨论】:

    【解决方案2】:

    您提到在安装或卸载服务时将文本“Test3”写入文件。不要将“Test3”写入文件,而是写入tw.WriteLine(ex.Message); 以查看具体的异常是什么。

    【讨论】:

    • 对不起,这里写代码时出错;我在方法开始时打印了另一个 Test3。我会修复它。正如我所指出的,该服务可以正确安装和卸载。还是谢谢你。
    【解决方案3】:

    我终于找到了问题。

    它位于ServiceManager中;当我从 IDE 安装服务时,它的可执行文件名称为 MyService.vshost.exe 而不是 MyService.exe。

    我通过以下链接找到了这篇文章,

    http://www.c-sharpcorner.com/UploadFile/timosten/DynamicServiceInCSharp11262005062503AM/DynamicServiceInCSharp.aspx

    查看它正在写入的注册表项:

    //Open the HKEY_LOCAL_MACHINE\SYSTEM key
    system = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("System");
    //Open CurrentControlSet
    currentControlSet = system.OpenSubKey("CurrentControlSet");
    //Go to the services key
    services = currentControlSet.OpenSubKey("Services");
    

    非常感谢所有试图提供帮助的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      相关资源
      最近更新 更多