2011-04-18 4 views
1

자체 설치 가능한 Windows 서비스를 개발 중입니다. 설치/제거를 처리하는 ServiceManager 클래스가 있는데 제대로 작동하는 것 같습니다. 그러나.Net Windows 서비스가 실행되지 않습니다.

, 내가 실행하려고 할 때 내가 얻을 서비스, 즉시, 다음 텍스트와 함께 메시지 박스 시작 :

지역 시스템에서 서비스를 시작할 수 없습니다 있습니다. 오류 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를 사용하고있어 권한 문제가 없어야합니다.

시스템 및 NetworkService 계정으로 서비스를 설치하려고 시도했지만 동일한 문제가 발생합니다.

관리자 계정을 사용하면 계정과 관련된 또 다른 오류가 표시됩니다 (암호가 없기 때문입니다).

어떤 일이 발생하는지 알고 싶습니다.

업데이트 : 다윗의 질문에 대답,이 (손 번역, 영어 메시지가 다를 수 있습니다) 이벤트 로그의 말씀입니다 :

서비스를 시작할 수 없습니다. 서비스 프로세스가 서비스 컨트롤러에 연결할 수 없습니다.

업데이트 2 : Applicatin 로그에 더주의 깊게 살펴보면, 이전 오류는 서비스 설치 이름과 디자이너의 ServiceName은 속성 사이의 불일치 때문. 그것은 이미 고쳐졌다. 이제는 이벤트 로그에 새로운 오류가 없지만 문제가 지속됩니다.

+0

이벤트 로그를 확인 했습니까? 일반적으로 서비스가 시작되지 않으면 자동으로 "응용 프로그램"이벤트 로그에 기록되는 오류가 발생합니다. 그게 무슨 일이 일어나는지 말해 줄거야. – David

+0

@David : 팁 주셔서 감사합니다. 질문이 업데이트되었습니다. – raven

답변

0

마침내 문제가 발견되었습니다.

이것은 ServiceManager에 있습니다. IDE에서 서비스를 설치하면서 MyService.exe 대신 MyService.vshost.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"); 

당신에게 도움을하려고 모든 사람에게 많이 감사합니다

나는이 그것을 기록 된 레지스트리 키를 찾고

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

, 다음 링크를 통해 읽어 냈다.

1

모양에서 보면 서비스를 실행하는 스레드를 시작해야합니다.

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

젠장! 고마워, 아직도 작동하지 않습니다. – raven

1

서비스를 설치 또는 제거 할 때 "Test3"이라는 텍스트가 파일에 기록됩니다. 파일에 "Test3"을 쓰는 대신 특정 예외가 무엇인지 확인하려면 tw.WriteLine(ex.Message);을 작성하십시오.

+0

죄송합니다. 여기에 코드를 쓰는 중 오류가 발생했습니다. 방법의 시작 부분에 또 다른 Test3 인쇄가있었습니다. 내가 고칠거야. 내가 지적했듯이 서비스는 올바르게 설치되고 제거됩니다. 어쨌든 고맙습니다. – raven

관련 문제