我正致力于在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
,
但是当我第二次运行时,程序没有继续,并且没有例外。
有什么问题?
答案 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
最好的解决方案是围绕代码进行试用