Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象引用未设置为对象c#Windows服务的实例_C#_Windows_Windows Services_Registry_Stack Trace - Fatal编程技术网

对象引用未设置为对象c#Windows服务的实例

对象引用未设置为对象c#Windows服务的实例,c#,windows,windows-services,registry,stack-trace,C#,Windows,Windows Services,Registry,Stack Trace,我正在Windows Services中创建一个程序,希望从注册表文件中获取值,并将其放入在程序中创建的结构数据库中,然后在启动方法中运行它 每次我尝试在服务中运行程序时,它都会启动和停止,当我在事件查看器中查看错误消息时,当我到达方法中的某个点时,我总是得到消息对象引用未设置为对象的实例 这里是我创建注册表方法配置的地方。我在语句的每个部分都使用了WriteToEventLog消息来查看未调用它的位置: public static class ServerConfiguration

我正在Windows Services中创建一个程序,希望从注册表文件中获取值,并将其放入在程序中创建的结构数据库中,然后在启动方法中运行它

每次我尝试在服务中运行程序时,它都会启动和停止,当我在事件查看器中查看错误消息时,当我到达方法中的某个点时,我总是得到消息对象引用未设置为对象的实例

这里是我创建注册表方法配置的地方。我在语句的每个部分都使用了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();

    }

是否有人能帮助解释为什么它无法到达配置中的方法的其余部分?

如果您不确定这些键getvalue调用是否始终具有值,那么我会这样做:

currentkey = mykey.GetValue("DBAUTH", "") as String;
然后可以检查currentKey是否为空

如果演员阵容不起作用,那么就这样做:

currentkey = (mykey.GetValue("DBAUTH", "") ?? "").ToString();

然后您可以检查它是否为空字符串。我还没有测试过,但这是一般逻辑。

如果它打印的是日志3而不是日志4,那么我猜
mykey.GetValue(“DBAUTH”)是空的。
可能是您在没有管理员权限的情况下运行程序,并且您的计算机上启用了UAC?尝试使用本地系统帐户标识运行您的服务通过调用
System.Diagnostics.Debugger.Launch在启动方法开始时启动
来直接调试您的服务。当您启动服务时,应该给您一个对话框,允许您跳转到调试会话。您可以从那里正常地单步执行代码。啊,,问题描述听起来好像您没有足够的权限从注册表读取。它实际上在wards上到达log#2而不是log#3,所以现在我真的不知道为什么它不起作用。问题解决了似乎是注册表区分大小写,在将mykey设置为Registry.LocalMachine.OpenSubKey部分。感谢您的想法,但不幸的是,它仍然没有运行,实际上它只能访问log#2。问题解决了,问题似乎是注册表区分大小写,在将mykey设置为Registry.LocalMachine.OpenSubKey部分时需要双斜杠。再次感谢您的输入。@TireniDada您应该在回答时写下您的评论,并标记已解决的问题。