获取注册表值会导致程序无异常结束

时间:2013-04-17 07:49:22

标签: c# winforms registry

我正致力于在Windows窗体中获取和设置注册表值。

我的代码如下所示:

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("SmogUser");
if (((Guid)key.GetValue("DeviceId", Guid.Empty)) == Guid.Empty)
{
    Guid deviceId = Guid.NewGuid();
    key.SetValue("DeviceId", deviceId);
    key.Close();
}
else
{
    Guid deviceId = (Guid)key.GetValue("DeviceId");
}

当我第一次运行程序时,它进入if子句并设置deviceId, 但是当我第二次运行时,程序没有继续,并且没有例外。

有什么问题?

3 个答案:

答案 0 :(得分:2)

我不明白为什么RegistryKey.GetValue()方法行为错误,但我使用此代码解决了您的问题:

        Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("SmogUser");
        if (key != null)
        {
            var value = key.GetValue("DeviceId", null) ?? Guid.Empty;

            if (Guid.Empty.Equals(value))
            {
                Guid deviceId = Guid.NewGuid();
                key.SetValue("DeviceId", deviceId);
                key.Close();
            }
            else
            {
                var deviceId = (Guid)key.GetValue("DeviceId");
            }
        }

似乎如果您将null作为默认值传递,则该方法不会崩溃。然后,您可以检查null并将Guid变量值设置为Guid.Empty

答案 1 :(得分:1)

您在Guid.Empty的第二个参数中将默认值设为key.GetValue("DeviceId", Guid.Empty),然后将其与Guid.Empty进行比较。

第一次没有密钥时,会返回Guid.Empty并输入if阻止。然后返回另一个值(DeviceId)并输入else

考虑msdn以获取有关RegistryKey.GetValue参数的信息。签名是

public Object GetValue(
    string name,
    Object defaultValue)

RegistryKey.CreateSubKey“创建新子项或打开现有子项。”

当您在注册表中没有密钥时,您将看到第二个参数将被返回。请注意,注册表在执行程序之间仍然存在


这里的问题是你正在阅读两次注册表。

RegistryKey key = Registry.CurrentUser.CreateSubKey("SmogUser");
Guid regValue = Guid.Parse(key.GetValue("DeviceId", Guid.Empty).ToString());
if (value == Guid.Empty)
{
    regValue = Guid.NewGuid();
    key.SetValue("DeviceId", regValue);
    key.Close();
}
//here you have Guid in regValue, which is exactly the same
//as in registry. No need to call GetValue again

答案 2 :(得分:1)

您正在尝试从对象转换为导致错误的Guid。这有效 -

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("SmogUser");
if ((new Guid(key.GetValue("DeviceId", Guid.Empty).ToString()) == Guid.Empty))
{
    Guid deviceId = Guid.NewGuid();
    key.SetValue("DeviceId", deviceId);
    key.Close();
}
else
{
    Guid deviceId = new Guid(key.GetValue("DeviceId").ToString());
}

基本上我正在转换为字符串,然后从字符串中创建一个新的Guid对象。直接从对象转换为Guid第二次不起作用,因为返回了Guid字符串值。

对于没有抛出异常的问题,64位的Visual Studio会发生这种情况,请参阅同一主题的其他帖子 -

Visual Studio 2010 debugger is no longer stopping at errors VS2010 does not show unhandled exception message in a WinForms Application on a 64-bit version of Windows

最好的解决方案是围绕代码进行试用