32 ビット アプリケーションから 64 ビット レジストリへのアクセス
課題: 32 ビット アプリケーションでは、SQL Server インスタンスの詳細を取得するなど、多くの場合 64 ビット レジストリ キーにアクセスする必要があります。 ただし、通常は Wow6432Node
ブランチにのみアクセスします。
解決策: Windows 7 以降では、.NET Framework 4.x 以降を介して 64 ビット レジストリ キーにアクセスするためのサポートが組み込まれています。 重要なのは、RegistryView
列挙型を使用することです:
RegistryView.Registry64
: 64 ビット レジストリにアクセスします。RegistryView.Registry32
: 32 ビット レジストリにアクセスします。コード例 (ダイレクト 64 ビット アクセス):
このコード スニペットは、64 ビット レジストリへの直接アクセスを示しています:
<code class="language-csharp">using Microsoft.Win32; RegistryKey localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); RegistryKey sqlServerKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"); string sqlExpressKeyName = (string)sqlServerKey.GetValue("SQLEXPRESS"); </code>
より堅牢なアプローチ (ヘルパー関数):
柔軟性を高めるために、これらのヘルパー関数は 32 ビットと 64 ビットの両方のレジストリをクエリし、結果を統合します。
<code class="language-csharp">using Microsoft.Win32; using System.Collections.Generic; using System.Linq; public static IEnumerable<string> GetAllRegValueNames(string RegPath, RegistryHive hive = RegistryHive.LocalMachine) { var reg64 = GetRegValueNames(RegistryView.Registry64, RegPath, hive); var reg32 = GetRegValueNames(RegistryView.Registry32, RegPath, hive); var result = (reg64 != null && reg32 != null) ? reg64.Union(reg32) : (reg64 ?? reg32); return (result ?? new List<string>().AsEnumerable()).OrderBy(x => x); } public static object GetRegValue(string RegPath, string ValueName = "", RegistryHive hive = RegistryHive.LocalMachine) { return GetRegValue(RegistryView.Registry64, RegPath, ValueName, hive) ?? GetRegValue(RegistryView.Registry32, RegPath, ValueName, hive); } private static IEnumerable<string> GetRegValueNames(RegistryView view, string regPath, RegistryHive hive) { try { using (var key = RegistryKey.OpenBaseKey(hive, view).OpenSubKey(regPath)) { return key?.GetValueNames(); } } catch (Exception) { return null; } } private static object GetRegValue(RegistryView view, string regPath, string valueName, RegistryHive hive) { try { using (var key = RegistryKey.OpenBaseKey(hive, view).OpenSubKey(regPath)) { return key?.GetValue(valueName); } } catch (Exception) { return null; } }</code>
ヘルパー関数の使用:
この例ではヘルパー関数を利用します:
<code class="language-csharp">var sqlRegPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"; foreach (var valueName in GetAllRegValueNames(sqlRegPath)) { var value = GetRegValue(sqlRegPath, valueName); Console.WriteLine($"{valueName}={value}"); }</code>
この改善されたアプローチは、潜在的な例外を処理し、アプリケーションやレジストリ キーのアーキテクチャに関係なく、レジストリ情報にアクセスするためのより堅牢なソリューションを提供します。
以上が32 ビット アプリケーションはどのようにして 64 ビット Windows レジストリにアクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。