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

2

У меня есть простое приложение для Windows, которое я пытаюсь отлаживать в VS 2008 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()
    {
    }
}
Теги:
service
visual-studio-2008

4 ответа

4
Лучший ответ

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

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

foreach (ServiceBase service in servicesToRun) 
{
    stopMethod.Invoke(service, new object[] { args }); 
}
  • 0
    просто чтобы кое-что прояснить, метод OnStop в ServiceBase не имеет аргументов, поэтому нет необходимости передавать новый объект [] {args}
1

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

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

  • 0
    Это происходит только тогда, когда я отлаживаю (Environment.UserInteractive), но работает нормально при установке в качестве службы Windows
0

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

this.RequestAdditionalTime(4000);

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

0

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

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

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

System.Threading.Thread.Sleep(5000); 

Чтобы имитировать паузу в 5 секунд между запуском и остановкой служб.

  • 0
    Это тоже не сработало, но когда я вызываю метод «OnStop» с использованием отражения, как я это делал с «OnStart», я не получаю ошибок.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню