本文介绍了.NET Compact Framework下的注册表开发。
简介
本文叙述了CF.NET下的注册表开发的基本概念,介绍在Windows Mobile和Wince下操作注册表的东西,一起运用C#完成了一个注册表导出东西。
布景
Wince和Windows桌面体系相同都是把体系信息,驱动信息,应用程序信息等重要存放在注册表里边。最近需求完成3G设备的主动注册,3G链接项的主动创立功用。在完成该功用的过程中发现设备注册信息和链接项信息均保存在注册表里边,所以需求完成导出注册表功用,把注册前后的注册表信息进行比较。
什么是注册表
注册表(Registry)其实便是一个层次型的文件数据库,用于保存操作体系信息,驱动信息,应用程序信息,用户信息等等。在注册表内有两个要害项,Key和Value,这儿我保存英文,因为翻译成中文是键(key)和值(Value)比较简单混杂。所谓Key便是能够包括SubKey和Value的项。能够了解为一个容器节点,SubKey和Key在本质上是相同,SubKey能够持续包括SubKey和Value。Value便是包括数据类型,数据值的项,也能够了解为叶子节点,Value不能包括其他SubKey和Value。
注册表开发计划
检查和修正注册表,引荐运用以下两个东西:
Windows CE Remote Registry Editor,能够在VS 2005和VS 2008的菜单下找到。能够长途检查和修正注册表,十分便利。但是该东西不支撑导入导出功用。
PHM Registry Editor
该东西能够安装在设备上,在设备上直接检查和修正注册表。PHM Registry Editor一起支撑导入导出功用,但是导入导出是运用私有格局,和MS的不兼容。
注册表开发的实际
因为上述两个东西的局限性,所以我完成了一个注册表导出功用,和桌面版的Registry Editor导出功用的文件格局兼容。
操作注册表类是在CF.net 2.0引进的,CF.net 1.0不支撑。运用注册表功用,需求引证Microsoft.Win32 namespace。
- using Microsoft.Win32;
下面是导出接口,把根下所以key导出到StringBuilder中。
- public StringBuilder Export()
- {
- StringBuilder sb = new StringBuilder();
- Export(sb, Registry.ClassesRoot);
- Export(sb, Registry.CurrentUser);
- Export(sb, Registry.LocalMachine);
- Export(sb, Registry.Users);
- return sb;
- }
在Windows Mobile和Wince体系下注册表的项比桌面体系少一些,如上图可见。
下面的代码是导出详细的一个key。
- public void Export(StringBuilder sb, RegistryKey key)
- {
- //log down itself.
- sb.AppendFormat(CultureInfo.CurrentCulture, "\r\n[{0}]\r\n", key.Name);
- //log down values
- string[] s = key.GetValueNames();
- Array.Sort(s);
- //log down "Default" first
- try
- {
- key.GetValue(Default);
- ExportValue(sb, key, Default);
- }
- catch
- {
- }
- foreach(string name in s)
- {
- if (!name.Equals(Default))
- {
- ExportValue(sb, key, name);
- }
- }
- //log down subkeys
- s = key.GetSubKeyNames();
- Array.Sort(s);
- foreach(string subKeyName in s)
- {
- Export(sb, key.OpenSubKey(subKeyName));
- }
- }
导出Key是先导出本身,然后导出Value,导出Value时如果有Default Value的话先导出Default Value,然后导出其他Value。导出Value后再递归导出SubKeys。
下面代码是导出Value。
- private void ExportValue(StringBuilder sb, RegistryKey key, string name)
- {
- switch (key.GetValueKind(name))
- {
- case RegistryValueKind.DWord:
- int dword = (int)key.GetValue(name);
- if (name.Equals(Default))
- {
- sb.AppendFormat(CultureInfo.CurrentCulture, "@=dword:{0:X8}\r\n", dword);
- }
- else
- {
- sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=dword:{1:X8}\r\n", name, dword);
- }
- break;
- case RegistryValueKind.String:
- if (name.Equals(Default))
- {
- sb.AppendFormat(CultureInfo.CurrentCulture, "@=\"{0}\"\r\n", key.GetValue(name));
- }
- else
- {
- sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=\"{1}\"\r\n", name, key.GetValue(name));
- }
- break;
- case RegistryValueKind.MultiString:
- string[] values = (string[])key.GetValue(name);
- if (name.Equals(Default))
- {
- sb.Append("@=multi_sz:");
- }
- else
- {
- sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=multi_sz:", name);
- }
- for (int i = 0; i