c# - 从 32 位应用程序读取 64 位注册表

标签 c# .net 64-bit registry 32-bit

我有一个为 AnyCPU 编译的 c# 单元测试项目。我们的构建服务器是 64 位机器,并安装了 64 位 SQL Express 实例。
测试项目使用类似于以下的代码来标识 .MDF 文件的路径:

private string GetExpressPath()
{
    RegistryKey sqlServerKey = Registry.LocalMachine.OpenSubKey( @"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL" );
    string sqlExpressKeyName = (string) sqlServerKey.GetValue( "SQLEXPRESS" );
    RegistryKey sqlInstanceSetupKey = sqlServerKey.OpenSubKey( sqlExpressKeyName + @"\Setup" );
    return sqlInstanceSetupKey.GetValue( "SQLDataRoot" ).ToString();
}
这段代码在我们的 32 位工作站上运行良好,并且在构建服务器上运行正常,直到我最近启用了 NCover 的代码覆盖率分析。由于 NCover 使用 32 位 COM 组件,因此测试运行程序 (Gallio) 作为 32 位进程运行。
检查注册表,下面没有“Instance Names”项

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server


有没有办法让以 32 位模式运行的应用程序访问 Wow6432Node 之外的注册表?

最佳答案

创建/打开注册表项时,您必须使用 KEY_WOW64_64KEY 参数。但是 AFAIK 在 Registry 类中是不可能的,而只有在直接使用 API 时才可能。

This可能有助于您入门。

关于c# - 从 32 位应用程序读取 64 位注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/974038/

相关文章:

c# - 如何在 C# 中创建文件夹的哈希值?

c# - 我可以在同一参数中同时接受委托(delegate)类型 T 和 Expression<T> 吗?

c# - 对象级的 PropertyGrid 只读属性

c# - MessageBox 按钮 - 设置语言?

.net - WCF WebGetAttribute 与 WebInvokeAttribute

c - 可变参数函数传递很长但读取为 va_arg(argList, int)

c# - LibGit2Sharp 如何解决冲突?

c# - 使用 C# 以编程方式获取最后填充的 excel 行

c - C 中 uint64_t 变量的位移位运算

c# - 寻找图像转换库