关于64位操作系统使用C#访问注册表失败的问题
2015-12-29 20:32
501 查看
通过C#的注册表类 Registry.GetValue 进行访问时,其返回值一直为空。然后认真检查检查再检查了注册表路径,发现路径没有一点问题,不说废话,上代码:
万般无奈的时候,突然想到系统是64位,不禁想到刚毕业时,在64位系统上使用注册表编辑器导入软件配置环境的问题。首先介绍一下WoW64 (Windows 32-bits on Windows 64-bit),64位系统运行32位程序时,主要是同过该部分实现的。当然在wow下也存在注册表编辑器regedt32.exe。但是WoW64和System32中,注册表编辑器的结果是有可能不同的,下图是office2013的安装路径在WoW64和System32中的不同结果。
上图为使用32位注册表编辑器是的结果,此时Common下是无installroot节点的。
上图为使用64位注册表编辑器是的结果,完全正常。
说道这里,问题很明显了。Registry.GetValue访问注册表是,使用了32位注册表编辑器的结果。
为什么会这样呢,明明是64位的系统,然后检查了工程属性--》生成--》常规--》目标平台,原来是将程序编译成了32位的。将程序编译成32位之后,32位的程序访问注册表的结果与上图一一致。
将目标平台改为64位或者AnyCpu,问题即可解决。
那么问题又来了,32位程序如何访问64位的注册表呢?请看下文:/article/5265473.html
if (Registry.GetValue(@"HKEY_LOCAL_MACHINE\software\microsoft\office\15.0\common\installroot", "path", null) != null) { //office 2013 安装路径获取成功。 4 }
万般无奈的时候,突然想到系统是64位,不禁想到刚毕业时,在64位系统上使用注册表编辑器导入软件配置环境的问题。首先介绍一下WoW64 (Windows 32-bits on Windows 64-bit),64位系统运行32位程序时,主要是同过该部分实现的。当然在wow下也存在注册表编辑器regedt32.exe。但是WoW64和System32中,注册表编辑器的结果是有可能不同的,下图是office2013的安装路径在WoW64和System32中的不同结果。
上图为使用32位注册表编辑器是的结果,此时Common下是无installroot节点的。
上图为使用64位注册表编辑器是的结果,完全正常。
说道这里,问题很明显了。Registry.GetValue访问注册表是,使用了32位注册表编辑器的结果。
为什么会这样呢,明明是64位的系统,然后检查了工程属性--》生成--》常规--》目标平台,原来是将程序编译成了32位的。将程序编译成32位之后,32位的程序访问注册表的结果与上图一一致。
将目标平台改为64位或者AnyCpu,问题即可解决。
那么问题又来了,32位程序如何访问64位的注册表呢?请看下文:/article/5265473.html
相关文章推荐
- C#之数组与集合
- C# winform 编写一键排班软件时遇到的问题
- C# winform Datagridview 标题居中
- C# BackgroundWorker 异步控件 Demo示例
- c#window服务程序
- [.NET源码] C#制作的一套在线更新软件系统
- c# 方法重载
- C#中this关键字的使用
- C#中的转译字符以及字符串前面@的作用
- C# 给word文档添加水印
- C# DataGridView 导出 Excel(根据Excel版本显示选择不同后缀格式xls或xlsx)
- 一小时学会C# 6
- C#中构造函数的使用
- C#控件补充
- C#ProgressBar控件和 TrackBar控件
- C#Timer 控件
- C#PictureBox 控件
- C#CheckedListBox 控件
- C#ListBox控件
- C# 给word文档添加水印