我正在开发一个可自行安装的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属性不匹配造成的。它已经修好了;现在事件日志中没有新错误,但问题仍然存在。
答案 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。
我通过以下链接找到了这个阅读,
查看它正在编写的注册表项:
//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");
非常感谢那些试图提供帮助的人。