从 32 位 .NET 应用程序访问 64 位注册表项
从 64 位 Windows 系统上运行的 32 位应用程序访问 64 位注册表需要特定的方法。 幸运的是,.NET Framework 4.x 及更高版本对此提供了内置支持。
利用RegistryView进行64位注册表访问
RegistryView
枚举是区分 32 位和 64 位注册表访问的关键。 使用方法如下:
<code class="language-csharp">// Access the 64-bit registry using Microsoft.Win32; RegistryKey localKey64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); RegistryKey sqlServerKey64 = localKey64.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"); // Access the 32-bit registry RegistryKey localKey32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32); RegistryKey sqlServerKey32 = localKey32.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL");</code>
检索特定注册表值
要检索特定值,例如“Instance NamesSQL”键下的“SQLEXPRESS”,请使用:
<code class="language-csharp">string sqlExpressKeyName = (string)sqlServerKey64.GetValue("SQLEXPRESS");</code>
综合密钥检索:结合 32 位和 64 位结果
对于需要来自 32 位和 64 位注册表位置的数据的情况,组合查询是有益的:
<code class="language-csharp">using System.Linq; IEnumerable<string> GetAllRegValueNames(string regPath) { var reg64 = GetRegValueNames(RegistryView.Registry64, regPath); var reg32 = GetRegValueNames(RegistryView.Registry32, regPath); var result = (reg64 != null && reg32 != null) ? reg64.Union(reg32) : (reg64 ?? reg32); return (result ?? new List<string>().AsEnumerable()).OrderBy(x => x); }</code>
其中 GetRegValueNames
是一个辅助函数(未显示,但很容易实现),用于检索给定键下的值名称。 regPath
指定注册表路径。
用法示例:
<code class="language-csharp"> var sqlRegPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"; foreach (var keyName in GetAllRegValueNames(sqlRegPath)) { Console.WriteLine(keyName); } ``` This iterates through all found keys, regardless of whether they reside in the 32-bit or 64-bit registry hive.</code>
以上是如何从 32 位 .NET 应用程序访问 64 位注册表项?的详细内容。更多信息请关注PHP中文网其他相关文章!