代码之家  ›  专栏  ›  技术社区  ›  Tawani

Windows服务错误:“试图读取或写入受保护的内存。这通常表示其他内存已损坏。”

  •  2
  • Tawani  · 技术社区  · 16 年前

    我有一个简单的Windows服务应用程序,我正在尝试在VS2008 IDE中调试,但每次运行代码时,我都会得到错误信息。 “试图读取或写入受保护的内存。这通常表示其他内存已损坏。” . 此错误发生在 service.Stop() 线以下:

    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 回复  |  直到 16 年前
        1
  •  4
  •   tofi9    16 年前

    如果您想全面管理在外部启动ServiceBase ServiceBase.Run() ,那么你也应该用同样的方法阻止它:

    MethodInfo stopMethod = type.GetMethod("OnStop", flags); 
    
    foreach (ServiceBase service in servicesToRun) 
    {
        stopMethod.Invoke(service, new object[] { args }); 
    }
    
        2
  •  1
  •   John Saunders    16 年前

    在不调试时会发生这种情况吗?

    另外,这是一个例外吗?如果是这样,那么您应该发布完整的异常,包括内部异常和堆栈跟踪。

        3
  •  0
  •   Eoin Campbell    16 年前

    你试过移除

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

    我不知道这会对Windows服务产生什么影响,但尝试用

    System.Threading.Thread.Sleep(5000); 
    

    模拟服务启动和停止之间的5秒钟暂停。

        4
  •  0
  •   Halvard    16 年前

    是否尝试将以下代码行添加到重写的onstop()方法中?

    this.RequestAdditionalTime(4000);
    

    根据 Microsoft API documentation 它旨在由重写的OnContinue、OnPause、OnStart或OnStop方法调用,以请求挂起操作的额外时间。