You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:42:37