通过C#的注册表类 Registry.GetValue 进行访问时,其返回值一直为空。然后认真检查检查再检查了注册表路径,发现路径没有一点问题,不说废话,上代码:

    1. if(Registry.GetValue(@"HKEY_LOCAL_MACHINE\software\microsoft\office\15.0\common\installroot", "path", null) != null)
    2. {
    3. //office 2013 安装路径获取成功。
    4. }

    万般无奈的时候,突然想到系统是64位,不禁想到刚毕业时,在64位系统上使用注册表编辑器导入软件配置环境的问题。首先介绍一下WoW64 (Windows 32-bits on Windows 64-bit),64位系统运行32位程序时,主要是同过该部分实现的。当然在wow下也存在注册表编辑器regedt32.exe。但是WoW64和System32中,注册表编辑器的结果是有可能不同的,下图是office2013的安装路径在WoW64和System32中的不同结果。
    C#访问64位注册表 - 图1
    上图为使用32位注册表编辑器是的结果,此时Common下是无installroot节点的。
    C#访问64位注册表 - 图2
    上图为使用64位注册表编辑器是的结果,完全正常。
    说道这里,问题很明显了。Registry.GetValue访问注册表是,使用了32位注册表编辑器的结果。
    为什么会这样呢,明明是64位的系统,然后检查了工程属性–》生成–》常规–》目标平台,原来是将程序编译成了32位的。将程序编译成32位之后,32位的程序访问注册表的结果与上图一一致。
    将目标平台改为64位或者AnyCpu,问题即可解决。

    1. RegistryKey localKey;
    2. if (Environment.Is64BitOperatingSystem)
    3. localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
    4. else
    5. localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
    6. string value = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Office\15.0\Common\InstallRoot").GetValue("Path").ToString();

    很简单,首先,Environment.Is64BitOperatingSystem 判断是否是64位的操作系统。
    然后通过注册表打开目录时,传入相应的RegistryView枚举即可。注意:打开注册表时,调用的是OpenBaseKey方法!