精简框架上的注册表操作方法与普通框架中的注册表操作类和方法基本上是一样的,除了一些权限(Permission)和安全(Security)方法的区别而已.
最近碰到了这样一个问题:
对Mobile设备的注册表执行删除操作的时候,出现UnauthorizedAccessException的异常信息,而同样的代码在Framework中不会出现.
主要的方法有以下几个
因此,显然是CreateSubKey和OpenSubKey方法传出的RegistryKey在被使用后并没有被正常关闭导致的.
最近碰到了这样一个问题:
对Mobile设备的注册表执行删除操作的时候,出现UnauthorizedAccessException的异常信息,而同样的代码在Framework中不会出现.
主要的方法有以下几个
protected virtual void InitRegistryMapper()
{
RegistryKey root = Registry.LocalMachine.OpenSubKey(m_RegistryRoot, true);
if (root == null)
{
root = Registry.LocalMachine.CreateSubKey(m_RegistryRoot);
}
using (root)
{
m_RegMapperRoot = root.OpenSubKey(m_RegKeyName, true);
if (m_RegMapperRoot == null)
{
m_FirstRun = true;
m_RegMapperRoot = root.CreateSubKey(m_RegKeyName);
root.SetValue(m_RegKeyName, 1, RegistryValueKind.DWord);
}
else
{
int useCount = (int)root.GetValue(m_RegKeyName);
useCount++;
root.SetValue(m_RegKeyName, useCount, RegistryValueKind.DWord);
}
}
}
public RegistryKey CreateSubKey(string keyName)
{
return m_RegMapperRoot.CreateSubKey(keyName);
}
public void DeleteSubKey(string keyName)
{
m_RegMapperRoot.DeleteSubKeyTree(keyName);
}
public RegistryKey OpenSubKey(string keyName, bool writeable)
{
return m_RegMapperRoot.OpenSubKey(keyName, writeable);
}
每次执行DeleteSubKey方法便会出现权限不够的异常.后来才发现如果打开的RegistryKey对象如果没有关闭,那么对它进行操作就会出现此异常,{
RegistryKey root = Registry.LocalMachine.OpenSubKey(m_RegistryRoot, true);
if (root == null)
{
root = Registry.LocalMachine.CreateSubKey(m_RegistryRoot);
}
using (root)
{
m_RegMapperRoot = root.OpenSubKey(m_RegKeyName, true);
if (m_RegMapperRoot == null)
{
m_FirstRun = true;
m_RegMapperRoot = root.CreateSubKey(m_RegKeyName);
root.SetValue(m_RegKeyName, 1, RegistryValueKind.DWord);
}
else
{
int useCount = (int)root.GetValue(m_RegKeyName);
useCount++;
root.SetValue(m_RegKeyName, useCount, RegistryValueKind.DWord);
}
}
}
public RegistryKey CreateSubKey(string keyName)
{
return m_RegMapperRoot.CreateSubKey(keyName);
}
public void DeleteSubKey(string keyName)
{
m_RegMapperRoot.DeleteSubKeyTree(keyName);
}
public RegistryKey OpenSubKey(string keyName, bool writeable)
{
return m_RegMapperRoot.OpenSubKey(keyName, writeable);
}
因此,显然是CreateSubKey和OpenSubKey方法传出的RegistryKey在被使用后并没有被正常关闭导致的.
总结:在CompactFramework上,每次打开一个注册表项都要记得关闭