2009-04-24 3 views
2

저는 VS 2008 IDE에서 디버깅하려고하는데 간단한 Windows 서비스 응용 프로그램을 가지고 있지만 코드를 실행할 때마다 오류가 발생합니다. "보호 된 메모리를 읽거나 쓰려고 시도했습니다. 이것은 종종 다른 메모리가 손상되었음을 나타냅니다 . ". 이 오류는 아래 service.Stop() 줄에서 발생합니다 아래Windows 서비스 오류 : "보호 된 메모리를 읽거나 쓰려고 시도했습니다. 이것은 종종 다른 메모리가 손상되었음을 나타냅니다."

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main(string[] args) 
    { 
     ServiceBase[] servicesToRun; 
     servicesToRun = new ServiceBase[] 
     { 
      new Service1() 
     }; 

     if (Environment.UserInteractive) 
     { 
      Type type = typeof(ServiceBase); 
      BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; 
      MethodInfo method = type.GetMethod("OnStart", flags); 

      foreach (ServiceBase service in servicesToRun) 
      { 
       method.Invoke(service, new object[] { args }); 
      } 

      Console.WriteLine("Press any key to exit"); 
      Console.Read(); 

      foreach (ServiceBase service in servicesToRun) 
      { 
       service.Stop();//ERROR OCCURS HERE! 
      } 

     } 
     else 
     { 
      ServiceBase.Run(servicesToRun); 
     }    
    } 
} 

public partial class Service1 : ServiceBase 
{ 
    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
    } 

    protected override void OnStop() 
    { 
    } 
} 

답변

4

, 당신은 그것을 중지와 같은 트릭을 할도해야

MethodInfo stopMethod = type.GetMethod("OnStop", flags); 

foreach (ServiceBase service in servicesToRun) 
{ 
    stopMethod.Invoke(service, new object[] { args }); 
} 
+0

ServiceBase의 OnStop 메소드에는 인수가 없으므로 새 객체를 전달할 필요가 없습니다 [] {args} – pdiddy

0

당신이

Console.WriteLine("..."); 
Console.ReadLine(); 

을 제거 봤어 간단한 윈도우 서비스 클래스는 내가 아무 생각이 어떤 영향이도 없어 Windows 서비스를 사용했지만 그 (것)들을 교환 해달라고 시도하십시오

System.Threading.Thread.Sleep(5000); 

& 시작하는 서비스 사이에 5 초의 일시 중지를 시뮬레이트합니다.

+0

도 작동하지 않았다하지만 난 "를 OnStop"호출 할 때 방법은 "OnStart"로 수행 한 것처럼 반사를 사용하여 오류가 발생하지 않습니다. – Tawani

1

디버깅하지 않을 때 발생합니까?

또한 예외입니까? 그렇다면 내부 예외 및 스택 추적을 포함하여 완전한 예외를 게시해야합니다.

+0

이것은 (Environment.UserInteractive) 디버깅을 할 때만 발생하지만 Windows 서비스로 설치할 때 올바르게 실행됩니다. – Tawani

0

재정의 한 OnStop() 메서드에 다음 코드 줄을 추가하려고 시도 했습니까?

this.RequestAdditionalTime(4000); 

Microsoft API documentation에 따라이 계류중인 동작을위한 추가 시간을 요청하도록 재정의 OnContinue, OnPause, ONSTART 또는를 OnStop 메소드에 의해 호출되는 것으로 의도된다. 당신이 외부 ServiceBase.Run()을 ServiceBase을 시작하는 전체 경영을하려면

관련 문제

 관련 문제