.Net Windows服务无法运行

时间:2011-04-18 15:13:13

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

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

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

  

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

我的服务代码:

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();
        }
    }
}
除了安装或卸载服务(使用Test3字符串)之外,

不写入文件C:\ Test.txt。我正在使用Windows XP,所以不应该有权限问题。

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

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

关于会发生什么的任何想法?

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

  

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

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

3 个答案:

答案 0 :(得分:1)

从它的外观来看,你需要启动运行该服务的线程。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我终于找到了问题。

它位于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");

非常感谢那些试图提供帮助的人。

相关问题