遇到一个新需求,在exe执行初期把指定内容写入注册表,Playerprefs固然可以写入,但是小白不知道怎么利用Playerprefs写入DWORD类型的数据,因此使用了Registry类
一. 对注册表中键的访问
注册表中共可分为五类
一般在操作时,基本使用CurrentUser类
//使用Registry类要using win32的包using Microsoft.Win32;
那么如何将数据写入注册表??
public static void SetRegistryKey(string valueName, uint value, RegistryValueKind valueKind){//提供对注册表中HKEY_CURRENT_USER键的访问RegistryKey key = Registry.CurrentUser;//打开softwareRegistryKey software = key.OpenSubKey("SOFTWARE", true);RegistryKey softKey = software.OpenSubKey("第一层级", true);if (softKey == null){softKey = software.CreateSubKey("第一层级", true);}RegistryKey versionKey = softKey.OpenSubKey("第二层级", true);if (versionKey == null){versionKey = softKey.CreateSubKey("第二层级", true);}Int32 tempInt = 0; //预先定义一个有符号32位数//unchecked语句块内的转换,不做溢出检查unchecked{tempInt = (Int32)value; //强制转换成有符号32位数}//在项里创建值versionKey.SetValue(valueName, tempInt, valueKind);//最后要关掉versionKey.Close();}
//调用时SetRegistryKey("MARKER", 0xffffffff, RegistryValueKind.DWord);
二. 遇到的问题
这里在写入时遇到两个问题
- 写入值为0xffffffff时,会报错
原因为十六进制的ffffffff数值太大了,若直接setValue必然会报错
所以上面代码中写到
Int32 tempInt = 0; //预先定义一个有符号32位数
//unchecked语句块内的转换,不做溢出检查
unchecked
{tempInt = (Int32)value; //强制转换成有符号32位数
}
//在项里创建值
versionKey.SetValue(valueName, tempInt, valueKind);
需要先将十六进制的大数通过Int32进行强转,转成有符号的数值,在注册表中会自动补位
2. 注册表内容的写入放在了Awake()方法中
当放在Awake()中时,打出的包无论是否管理员方式运行,均无法插入至注册表
后面放在了Start()中,一下子就写入了
不知道是什么原因,但是若有些相似的问题,大家可以避免下
3. 如果win32包已经导入,但是Registry类依然报错
可以在unity最上方菜单栏File->Build Settings->Player Settings->Other Settings->Api compatibility level改成.Net 4.X
我使用的是unity2018.4.32版本,有点老了