レジストリの仮想化は、Windowsサービスでは無効になっています。また、x64バイナリでは仮想化が無効になっています。
はい、その通りです。64ビットプロセスと「サービスなどのインタラクティブではないプロセス」では無効になっています。
レジストリビューの詳細については、SOに関する以前の投稿をご覧ください。ビューと仮想化を混同しないでください。それらは異なります。32ビットアプリケーションを64ビットアプリケーションから分離するには、ビューが必要です。
C#では、OSに64ビットバージョンのレジストリを開くように要求するだけで同じことができます。
RegistryKey baseKey = RegistryKey.OpenBaseKey(
RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey key = baseKey.OpenSubKey("Software", false);
object value = key.GetValue("");
アプリケーション/サービスが32ビットマシンで実行される場合は、要求しても常に通常のレジストリを取得しますRegistryView.Registry64
。64ビットマシンで実行している場合は、常に通常のバージョンのレジストリ(= 64ビットバージョン)を取得します。
副次的な質問:アプリケーションをX86またはX64としてコンパイルする必要があるのはなぜですか?AnyCPUを単純に保持することはできませんか?
仮想化には別の目的があり、レジストリを32ビットアプリケーションから分離することを目的としていませんが、レガシーアプリケーションとの互換性を高めるために、64ビットネイティブアプリケーションがレジストリを正しい方法で使用することを望んでいます。非仮想化バージョンのレジストリにアクセスするには、REG_KEY_DONT_VIRTUALIZE
フラグを使用してレジストリキーを開く必要があります。このフラグをMicrosoft.Win32
クラスで使用することはできないため、クラスDllImport
とP/Invokeを使用する必要があります。