Windows Sandbox中C#程序无法读取ProductName注册表值求解决
解决方案:Windows Sandbox中C#读取HKLM注册表ProductName返回null的问题
问题原因
Windows Sandbox是64位运行环境,如果你编译的C#程序是32位(比如默认Any CPU且勾选了Prefer 32-bit),会触发注册表重定向机制:32位程序访问HKLM\SOFTWARE时,系统会自动重定向到HKLM\SOFTWARE\Wow6432Node,而这个子路径下并没有ProductName值,所以代码返回null。手动打开regedit时默认是64位视图,能直接看到HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion下的ProductName,因此出现差异。
可行解决方法
方法1:修改项目编译目标为64位
- 右键你的C#项目 → 选择「属性」
- 切换到「生成」标签页
- 「平台目标」选择
x64,取消勾选「Prefer 32-bit」(如果存在该选项) - 重新编译并运行程序,此时程序会以64位模式运行,直接访问正确的注册表路径。
方法2:强制读取64位注册表视图
如果需要保持程序为32位兼容,可以在打开注册表时指定读取64位视图,修改代码如下:
using Microsoft.Win32; // 方式1:通过OpenBaseKey指定64位视图 var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); var versionSubKey = baseKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"); string productName = versionSubKey?.GetValue("ProductName")?.ToString(); // 方式2:使用带权限参数的OpenSubKey重载(效果一致) // var versionSubKey = Registry.LocalMachine.OpenSubKey( // @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", // RegistryKeyPermissionCheck.ReadSubTree, // RegistryRights.ReadKey // ); // string productName = versionSubKey?.GetValue("ProductName")?.ToString();
注意添加?.空引用检查,避免程序因注册表项不存在而抛出异常。
额外说明
Windows Sandbox中读取该注册表路径不需要管理员权限,普通用户权限即可正常访问。
内容的提问来源于stack exchange,提问作者CaesarMyMate
相关产品推荐
相关产品推荐

