Я создал службу Windows, используя шаблон VS2017, и он создал два класса: Program.cs и Service1.cs:
Код функции Main () Program.cs разделен, как показано ниже:
#if DEBUG
Service1 service = new Service1();
service.OnDebug();
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
#endif
Это помогает мне, пока я отлаживаю свой сервис перед выпуском.
В классе Service1.cs у меня есть метод OnDebug ():
public void OnDebug()
{
OnStart(null);
}
и OnStartMethod () выглядит следующим образом:
protected override void OnStart(string[] args)
{
const string keyPath = "HKEY_CURRENT_USER\\Software\\MyKey";
string companyCardNumber = null;
while (companyCardNumber == null || companyCardNumber.Equals(""))
{
companyCardNumber = (string)Registry.GetValue(keyPath, "CompanyCardNumber", null);
if (companyCardNumber != null && !companyCardNumber.Equals(""))
{
break;
}
Debug.WriteLine("company card number in registry is empty or key doesn't exist");
System.Threading.Thread.Sleep(5000);
}
//more code...
}
Теперь проблема в том, что когда я использую режим DEBUG в VS, он переходит на //more code
и программа корректно считывает значение из реестра.Но когда я переключаюсь в режим RELEASE и развертываю службу, а затем устанавливаю, она зацикливается в этом while
и после
companyCardNumber = (string)Registry.GetValue(keyPath, "CompanyCardNumber", null);
companyCardNumer
не имеет никакого значения.
Что вызывает эту проблему?Нужны ли мне какие-либо административные привилегии для чтения значений из реестра?Это было бы странно, потому что, как пользователь, я могу изменять регистр.Еще одна вещь, которую я заметил, это состояние сервиса, потому что большинство сервисов запущены, но мой запускается (если я могу так сказать).Но он все еще работает, но companyCardNumber
пусто.