У меня есть простое приложение для 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()
{
}
}
Если вы хотите полностью управлять запуском ServiceBase за пределами ServiceBase.Run()
, тогда вы также должны сделать тот же трюк с его остановкой:
MethodInfo stopMethod = type.GetMethod("OnStop", flags);
foreach (ServiceBase service in servicesToRun)
{
stopMethod.Invoke(service, new object[] { args });
}
Это происходит, когда вы не отлаживаете?
Кроме того, это исключение? Если да, тогда вы должны опубликовать полное исключение, включая внутренние исключения и трассировки стека.
Вы пытались добавить следующую строку кода к вашему переопределенному методу OnStop()?
this.RequestAdditionalTime(4000);
В соответствии с Документация по API Microsoft она должна быть вызвана переопределенным OnContinue, OnPause, OnStart или OnStop, чтобы запросить дополнительное время для ожидающей операции.
Вы пытались удалить
Console.WriteLine("...");
Console.ReadLine();
Я не знаю, какое влияние это оказало бы на службу Windows, но попробуйте заменить их
System.Threading.Thread.Sleep(5000);
Чтобы имитировать паузу в 5 секунд между запуском и остановкой служб.