如何使用 .NET 3.5 (CF) 更新注册表?
How can I update the registry using .NET 3.5 (CF)?
可以看出 ,在我朋友的一点帮助下,我最终能够使用以下代码更新 .NET 4.5 应用程序中的注册表:
RegistryKey reg64key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey reg_64bit_AppKey = reg64key.OpenSubKey(@"SOFTWARE\Android Studio", true);
if (reg_64bit_AppKey != null)
{
reg_64bit_AppKey.SetValue("StartMenuGroup", "Droidio", RegistryValueKind.String);
}
else
{
MessageBox.Show("Cannot open registry");
}
...但是尝试使该测试代码适应 my.NET 3.5 应用程序不起作用 - 它甚至无法编译。我将“64”更改为“32”(这是一个 Windows CE / Compact Framework 应用程序),并更改了我想要更改的特定注册表位置和值,如下所示:
private void UpdateRegistry()
{
RegistryKey reg32key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
RegistryKey reg_32bit_AppKey = reg32key.OpenSubKey(@"SOFTWARE\Microsoft\Windows CE Services", true);
if (reg_32bit_AppKey != null)
{
MessageBox.Show(String.Format("value was {0}", reg_32bit_AppKey.GetValue("GuestOnly")));
reg_32bit_AppKey.SetValue("GuestOnly", 00000001, RegistryValueKind.DWord);
MessageBox.Show(String.Format("value is now {0}", reg_32bit_AppKey.GetValue("GuestOnly")));
}
else
{
MessageBox.Show("Cannot open registry");
}
}
...但是,如前所述,它无法编译。可以看出here, OpenBaseKey is new with .NET 4, and I'm using .NET 3.5 (Compact Framework). RegistryHive also shows "red" in the IDE, but maybe that's because of the problems with OpenBaseKey (according to this,我应该可以用)。
RegistryView,与 OpenBaseKey 一样,在 .NET 3.5 发布时在 .NET 架构师的眼中甚至都不是一线——它 first appeared in .NET 4.
那么我如何才能在 .NET 3.5 中完成我在 .NET 4.5 中所做的同样的事情(没有 OpenBaseKey 和 RegistryView[=35 的好处=],也许 RegistryHive)?
更新
事实证明我可能 尝试更新 "GuestOnly" 设置。
您将不得不使用 PInvoke:https://msdn.microsoft.com/en-us/library/aa446536.aspx. Turns our someone has done most of the before: https://social.msdn.microsoft.com/Forums/vstudio/en-US/4b2075bf-bba3-45fa-941c-a145fac56e13/registry-class-using-pinvoke?forum=csharpgeneral祝您好运!
我将 .NET 3.5 代码简化为:
private void UpdateRegistry()
{
RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows CE Services");
if (key != null)
{
MessageBox.Show(String.Format("value was {0}", key.GetValue("GuestOnly")));
key.SetValue("GuestOnly", 00000001, RegistryValueKind.DWord);
MessageBox.Show(String.Format("value is now {0}", key.GetValue("GuestOnly")));
}
}
...它似乎有效;第一个 MessageBox 显示 "value was " (空白),第二个是“"value was 1"
注意:该代码适用于 .NET 3.5,但对于更老旧的 .NET 版本,"Registry"、"Registry" 和 "Registry" 类 无法立即使用。
好消息是,如果您有 OpenNETCF installed/referenced 并使用 "using OpenNETCF.Win32;"
,则完全相同的代码也可以工作
可以看出
RegistryKey reg64key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey reg_64bit_AppKey = reg64key.OpenSubKey(@"SOFTWARE\Android Studio", true);
if (reg_64bit_AppKey != null)
{
reg_64bit_AppKey.SetValue("StartMenuGroup", "Droidio", RegistryValueKind.String);
}
else
{
MessageBox.Show("Cannot open registry");
}
...但是尝试使该测试代码适应 my.NET 3.5 应用程序不起作用 - 它甚至无法编译。我将“64”更改为“32”(这是一个 Windows CE / Compact Framework 应用程序),并更改了我想要更改的特定注册表位置和值,如下所示:
private void UpdateRegistry()
{
RegistryKey reg32key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
RegistryKey reg_32bit_AppKey = reg32key.OpenSubKey(@"SOFTWARE\Microsoft\Windows CE Services", true);
if (reg_32bit_AppKey != null)
{
MessageBox.Show(String.Format("value was {0}", reg_32bit_AppKey.GetValue("GuestOnly")));
reg_32bit_AppKey.SetValue("GuestOnly", 00000001, RegistryValueKind.DWord);
MessageBox.Show(String.Format("value is now {0}", reg_32bit_AppKey.GetValue("GuestOnly")));
}
else
{
MessageBox.Show("Cannot open registry");
}
}
...但是,如前所述,它无法编译。可以看出here, OpenBaseKey is new with .NET 4, and I'm using .NET 3.5 (Compact Framework). RegistryHive also shows "red" in the IDE, but maybe that's because of the problems with OpenBaseKey (according to this,我应该可以用)。
RegistryView,与 OpenBaseKey 一样,在 .NET 3.5 发布时在 .NET 架构师的眼中甚至都不是一线——它 first appeared in .NET 4.
那么我如何才能在 .NET 3.5 中完成我在 .NET 4.5 中所做的同样的事情(没有 OpenBaseKey 和 RegistryView[=35 的好处=],也许 RegistryHive)?
更新
事实证明我可能
您将不得不使用 PInvoke:https://msdn.microsoft.com/en-us/library/aa446536.aspx. Turns our someone has done most of the before: https://social.msdn.microsoft.com/Forums/vstudio/en-US/4b2075bf-bba3-45fa-941c-a145fac56e13/registry-class-using-pinvoke?forum=csharpgeneral祝您好运!
我将 .NET 3.5 代码简化为:
private void UpdateRegistry()
{
RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows CE Services");
if (key != null)
{
MessageBox.Show(String.Format("value was {0}", key.GetValue("GuestOnly")));
key.SetValue("GuestOnly", 00000001, RegistryValueKind.DWord);
MessageBox.Show(String.Format("value is now {0}", key.GetValue("GuestOnly")));
}
}
...它似乎有效;第一个 MessageBox 显示 "value was " (空白),第二个是“"value was 1"
注意:该代码适用于 .NET 3.5,但对于更老旧的 .NET 版本,"Registry"、"Registry" 和 "Registry" 类 无法立即使用。
好消息是,如果您有 OpenNETCF installed/referenced 并使用 "using OpenNETCF.Win32;"
,则完全相同的代码也可以工作