Исключение NullReferenceException в ServiceController.Stop

#c# #winforms #multithreading #windows-services #wrapper

#c# #winforms #многопоточность #windows-службы #оболочка

Вопрос:

Чтобы иметь возможность протестировать некоторую логику, связанную с мониторингом служб Windows, я создал оболочку ServiceController, которая в целом выглядит как:

 public class ServiceControllerWrapper : IServiceController
{
    public ServiceControllerWrapper(ServiceController controller)
    {
        this.controller = controller;
    }

    public void Stop()
    {
        if(controller == null)
            return;

        // actually the following code is running in a new thread
        // but nothing more

        try
        {
            controller.Stop();
        }
        catch(...)
        {
            ...
        }
    }

    ... similar methods

    private readonly ServiceController controller;
}
  

Я разрешил контроллеру иметь значение null, но по-прежнему невозможно получить исключение NullReferenceException из-за проверки на значение null при запуске метода Stop.

Это происходит периодически, и исключение, которое я получаю, является:

System.NullReferenceException Ссылка на объект не установлена на экземпляр объекта. в системе.Процесс обслуживания.ServiceController.Stop().

Ошибка в настоящее время возникает только в 64-разрядной системе Win2008

Есть ли какие-либо ошибки, которые я делаю, или какая-либо причина, по которой контроллер становится нулевым после проверки на not null?

Редактировать:

Помогло заглянуть внутрь кода ServiceController. Прежде чем выполнять какие-либо операции со службами, я вызываю контроллер.Обновите, и он работает хорошо.

Комментарии:

1. Если трассировка стека показывает ServiceController. Остановка как часть трассировки стека, которая предполагает, что исключение генерируется внутри этого метода, а не вашим кодом.

2. @Jon Skeet В MSDN я вижу только два типа исключений, которые могут быть сгенерированы ServiceController. Остановка — исключение Win32Exception и исключение InvalidOperationException. Может ли исключение NullReferenceException быть связано с каким-либо из них?

3. Оно не должно выдаваться, но это может указывать на ошибку внутри фреймворка.

Ответ №1:

Это исключение выглядит так, как будто нулевая ссылка возникает внутри ServiceController.Stop() . Попробуйте использовать .NET Reflector, чтобы посмотреть, что происходит внутри этого метода.