【发布时间】:2014-01-14 17:37:09
【问题描述】:
我正在 Windows 服务中创建一个程序,我想从注册表文件中获取值并将它们放入在我的程序中创建的结构数据库中,然后在启动方法中运行它。
每次我尝试在服务中运行程序时,它都会启动和停止,当我在事件查看器中查看错误消息时,当我到达方法中的某个点时,我不断收到消息 Object reference not set to an instance of an object .
这里是我创建注册表方法配置的地方。我在语句的每个部分都使用了 WriteToEventLog 消息来查看它没有被调用的位置:
public static class ServerConfiguration
{
public static void GetServerConfiguration()
{
try
{
Logging.WriteToEventLog("1", EventLogEntryType.Error);
RegistryKey mykey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE/PULSE/SERVER",false);
Logging.WriteToEventLog("2", EventLogEntryType.Error);
if (mykey != null)
{
Logging.WriteToEventLog("3", EventLogEntryType.Error);
string currentkey;
currentkey = mykey.GetValue("DBAUTH", "").ToString();
Logging.WriteToEventLog("4", EventLogEntryType.Error);
if (currentkey != null)
Configuration.Database.trustedauth = Convert.ToBoolean(currentkey);
currentkey = mykey.GetValue("DBNAME", "").ToString();
Logging.WriteToEventLog("5", EventLogEntryType.Error);
if (currentkey != null)
Configuration.Database.Databasename = Convert.ToString(currentkey);
currentkey = mykey.GetValue("DBPASSWORD", "").ToString();
Logging.WriteToEventLog("6", EventLogEntryType.Error);
if (currentkey != null)
Configuration.Database.password = Convert.ToString(currentkey);
currentkey = mykey.GetValue("DBSERVER", "").ToString();
Logging.WriteToEventLog("7", EventLogEntryType.Error);
if (currentkey != null)
Configuration.Database.Server = Convert.ToString(currentkey);
currentkey = mykey.GetValue("DBUSER", "").ToString();
Logging.WriteToEventLog("8", EventLogEntryType.Error);
if (currentkey != null)
Configuration.Database.username = Convert.ToString(currentkey);
}
mykey.Flush();
mykey.Close();
}
catch (Exception ex)
{
Logging.WriteToEventLog("Message: " + ex.Message + "\nStack: " + ex.StackTrace, EventLogEntryType.Error);
throw ex;
}
}
}
当我在事件查看器中运行它后检查事件查看器时,它到达事件日志编号 3,但之后停止并且无法到达字符串 currentkey;在病房里。
这里是我在 ServiceBase 的 OnStart 方法中调用它的地方:
protected override void OnStart(string[] args)
{
Configuration.ServerConfiguration.GetServerConfiguration();
}
有人能帮忙解释为什么它无法到达配置中的其余方法吗?
【问题讨论】:
-
如果它打印日志#3 但不打印日志#4,那么我猜
mykey.GetValue("DBAUTH", "")为空。 -
也许你在没有管理员权限的情况下运行你的程序并且你的机器上启用了 UAC?尝试使用本地系统帐户身份运行您的服务
-
在启动方法的开头调用
System.Diagnostics.Debugger.Launch直接调试您的服务。当您启动您的服务时,您应该会看到一个对话框,让您可以跳入调试会话。您可以从那里正常单步执行代码。 AFWIW,问题描述听起来像是您没有足够的权限从注册表中读取。 -
它实际上达到了 log #2 而不是在病房上 log #3 所以现在我真的不知道为什么它不起作用。
-
问题解决了似乎问题是注册表区分大小写并且在将 mykey 设置为 Registry.LocalMachine.OpenSubKey 部分时需要双斜杠。
标签: c# windows windows-services registry stack-trace