2009-04-24 43 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方法被调用来请求额外的时间用于挂起操作。

相关问题