我在Windows服务中创建一个程序,我希望从注册表文件中获取值,并将它们放入在我的程序中创建的struct数据库中,然后在on start方法中运行它。
每当我尝试在服务中运行程序时,它就会启动和停止,当在事件查看器中查看错误消息时,当我到达方法中的某个点时,我不断收到消息对象引用未设置为对象的实例
这是我创建注册表方法配置的地方。我在语句的每个部分都使用了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();
}
有人能够帮助解决为什么它无法达到配置中的其余方法吗?
答案 0 :(得分:0)
如果您不确定这些关键的getvalue调用是否总是有值,那么我会这样做:
currentkey = mykey.GetValue("DBAUTH", "") as String;
然后你可以检查currentKey是否为空。
如果该演员表不起作用,请执行以下操作:
currentkey = (mykey.GetValue("DBAUTH", "") ?? "").ToString();
然后你可以检查它是否是一个空字符串。我没有测试过,但这是一般逻辑。