我使用VS2017模板创建了一个Windows服务,它创建了两个类:Program.cs和Service1.cs:
Program.cs Main()函数代码分开如下:
#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...
}
现在的问题是,当我在VS中使用DEBUG模式时,它转到//more code
并正确编程从注册中读取值。但是,当我切换到RELEASE模式并部署服务然后安装时,它会在此while
和
companyCardNumber = (string)Registry.GetValue(keyPath, "CompanyCardNumber", null);
companyCardNumer
没有任何价值。
是什么导致了这个问题?我是否需要任何管理权限才能从注册表中读取值?这将是奇怪的,因为作为用户我可以修改注册。我注意到的另一件事是服务状态,因为大多数服务都已启动,但是我的正在启动(如果可以的话)。但它仍在工作,但companyCardNumber
是空的。