2009-04-24 20 views
2

我有一個簡單的Windows服務應用程序,我試圖在VS 2008 IDE中進行調試,但每次運行代碼時,出現錯誤「嘗試讀取或寫入受保護的內存,這通常表示其他內存已損壞「。。在下面的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); 
     }    
    } 
} 

下面是一個簡單的Windows服務類

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

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

    protected override void OnStop() 
    { 
    } 
} 

回答

4

如果你想利用外面開始ServiceBase ServiceBase.Run()的全程管理,那麼你也應該做同樣的伎倆與停止它:

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

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

安裝時運行正常,以澄清某些事情,ServiceBase的OnStop方法沒有參數,因此不需要傳遞新對象[] {args} – pdiddy 2009-11-27 16:12:30

0

您是否嘗試刪除

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

我不知道什麼樣的影響這將有一個Windows服務,但嘗試更換它們與

System.Threading.Thread.Sleep(5000); 

模擬停止服務之間的5秒暫停開始&停止。

+0

那也是沒有工作,但是當我調用「調用OnStop」方法使用反射,就像我對「OnStart」做的那樣,我沒有得到錯誤。 – Tawani 2009-04-24 13:16:30

1

當您沒有調試時會發生這種情況嗎?

另外,這是一個例外嗎?如果是這樣,那麼你應該發佈完整的異常,包括內部異常和堆棧跟蹤。

+0

只有當我正在調試(Environment.UserInteractive)時,纔會發生這種情況,但作爲Windows服務 – Tawani 2009-04-24 13:26:19

0

您是否嘗試將以下代碼行添加到覆蓋的OnStop()方法?

this.RequestAdditionalTime(4000); 

按照Microsoft API documentation它旨在通過重寫OnContinue,在onPause,的OnStart,或調用OnStop方法被調用來請求額外的時間用於掛起操作。

相關問題