Ошибка службы Windows: «Попытка чтения или записи в защищенную память. Это часто свидетельствует о повреждении другой памяти». - PullRequest
2 голосов
/ 24 апреля 2009

У меня есть простое приложение службы Windows, которое я пытаюсь отладить в IDE VS 2008, но каждый раз, когда я запускаю код, я получаю сообщение об ошибке "Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другие память повреждена. ". Эта ошибка возникает в строке 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);
        }            
    }
}

Ниже приведен простой класс обслуживания окон

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

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

    protected override void OnStop()
    {
    }
}

Ответы [ 4 ]

4 голосов
/ 27 апреля 2009

Если вы хотите полностью управлять запуском ServiceBase за пределами ServiceBase.Run(), то вам также следует сделать тот же трюк с его остановкой:

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

foreach (ServiceBase service in servicesToRun) 
{
    stopMethod.Invoke(service, new object[] { args }); 
}
1 голос
/ 24 апреля 2009

Это происходит, когда вы не отлаживаете?

Кроме того, это исключение? Если это так, то вы должны опубликовать полное исключение, включая внутренние исключения и трассировки стека.

0 голосов
/ 24 апреля 2009

Вы пытались добавить следующую строку кода в переопределенный метод OnStop ()?

this.RequestAdditionalTime(4000);

Согласно документации Microsoft API он предназначен для вызова переопределенных методов OnContinue, OnPause, OnStart или OnStop для запроса дополнительного времени для ожидающей операции.

0 голосов
/ 24 апреля 2009

Вы пытались удалить

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

Я не знаю, какое влияние это окажет на службу Windows, но попробуйте заменить их на

System.Threading.Thread.Sleep(5000); 

Для имитации 5-секундной паузы между запуском и остановкой служб.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...