65.9K
CodeProject 正在变化。 阅读更多。
Home

处理系统注册表的 C# 类

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.74/5 (23投票s)

2002 年 3 月 30 日

CPOL

4分钟阅读

viewsIcon

109113

downloadIcon

1604

这个 C# 类可以检索、创建、删除注册表值和键,甚至更多...

引言

向您介绍一个类(当然是用 C# 编写的),它可以帮助您执行所有必要的系统注册表操作,例如检索和设置注册表键和值。

那么,我的类能做什么?我的 clsRegistry 类有 10 个有用的方法,它们为您提供了对 C# 内置注册表函数的易于理解的接口。C# 中的所有注册表函数都实现在 Microsoft.Win32 命名空间中,因此当您要处理系统注册表时,请不要忘记在项目中包含“using Microsoft.Win32;”声明……或者直接使用 clsRegistry 类。

clsRegistry 类描述

类方法是

  • GetStringValue

    检索指定的 String 值。返回一个 System.String 对象。

  • GetDWORDValue

    检索指定的 DWORD 值。返回一个 System.Int32 对象。*

  • GetBinaryValue

    检索指定的 Binary 值。返回一个 System.Byte[] 对象。

  • SetStringValue

    设置/创建指定的 String 值。

  • SetDWORDValue

    设置/创建指定的 DWORD 值。*

  • SetBinaryValue

    设置/创建指定的 Binary 值。

  • CreateSubKey

    创建新的子项或打开现有的子项。

  • DeleteSubKeyTree

    递归删除子项及其所有子项。

  • DeleteValue

    从(当前)键中删除指定的值。

  • GetValueType

    检索指定注册表值的类型。

* 通常,当您创建 DWORD 注册表值时,它应该是无符号 32 位整数值(或 System.UInt32 或简称为 uint),范围为0 到 4,294,967,295。但是!!!Microsotf.Win32.RegistryKey.SetValue() 方法强制将其设置为有符号 32 位整数(或 System.Int32 或简称为 int),范围为-2,147,483,648 到 2,147,483,647。如果您尝试分配一个大于2,147,483,647 的值,则会创建 String 值。所以,各位兄弟,请在此处极其小心,以免产生不希望的后果!!!

我还不确定这是个 bug 还是某种新约定。

如何将 clsRegistry 类包含到您的项目中

创建一个使用控制台应用程序模板的新应用程序,并将其命名为“RegClassTest”。实际上,应用程序的类型在这里并不重要;控制台应用程序只是我的偏好。它可以是Windows 应用程序或其他任何类型——您选择。现在(为了方便起见),您可以将 clsRegistry.cs 文件复制到项目的文件夹中。然后转到“项目”菜单,单击“添加现有项…”或只需按 ALT+SHIFT+A 打开“添加项”对话框。找到 clsRegistry.cs 文件,选择它,然后单击“打开”。查看“解决方案资源管理器”窗口:我们的文件应该已添加到项目中。

clsRegistry:类用法

clsRegistry.cs 添加到项目后,双击它以编辑代码。现在,将以下行替换为...

namespace RegistryClass

...替换为这一行

namespace RegClassTest

在这里,“RegClassTest”将替换为您项目的命名空间名称。

现在保存您的项目,然后转到您项目的类文件并打开代码窗口。为了开始使用我们的 clsRegistry 类,我们必须创建一个类的实例。它的做法如下:

//don't forget about Microsoft.Win32 namespace
//if you are going to use the C# Registry functions
using Microsoft.Win32;

static void Main(string[] args)
{
    clsRegistry reg = new clsRegistry(); //create new instance of clsRegistry class
    ...
}

重要提示:函数不返回错误代码。为此,提供了 strRegError 变量。此变量始终包含上一次操作的消息,如果未发生错误,则为 null。我建议您每次使用 clsRegistry 的函数时都检查错误。下面显示的示例说明了如何调用类函数以及如何检查错误

static void Main(string[] args)
{
    clsRegistry reg = new clsRegistry(); //create new instance of clsRegistry class

    /*========= WORKING WITH STRING VALUES =========*/
    Console.WriteLine ("/*========= WORKING WITH STRING VALUES =========*/");
    // Set string value
    Console.WriteLine ("SET");
    reg.SetStringValue (
        Registry.LocalMachine,
        "SOFTWARE\\RegClassTest",
        "myStringValue",
        "Mama, I've just set a string value :-)"
        );
    if (reg.strRegError == null)
        Console.WriteLine ("\"myStringValue\" has been successfully set");
    else
        Console.WriteLine ( "Error: " + reg.strRegError );

    // Get string value
    Console.WriteLine ("GET");
    string strValue = reg.GetStringValue (
        Registry.LocalMachine,
        "SOFTWARE\\RegClassTest",
        "myStringValue"
        );
    if (reg.strRegError == null)
        Console.WriteLine ("myStringValue = \"{0}\"", strValue);
    else
        Console.WriteLine ( "Error: " + reg.strRegError );

    Console.WriteLine ("\npress return to exit");
    Console.ReadLine ();
}

如果您插入上面的代码并运行项目,您将看到以下输出:

我已经为您准备了一个 完整示例——一个示例项目,演示了如何检索和设置 StringDWORDBinary 值,如何获取值的类型,如何创建新值以及如何删除注册表值和键。

执行完整示例后,您应该会看到以下输出:

后记

我花了很长时间寻找一个处理注册表的类。但我一无所获(甚至在 MSDN 上也没有)。所以我写了 clsRegistry。这是第一次尝试。我希望您能帮助我扩展和改进它。您的建议一如既往地受到欢迎。

- Alexandr Khilov

© . All rights reserved.