5

SQLServerをインストールしています。

レジストリでは、* HKEY_LOCAL_MACHINE \ SOFTWARE \Microsoft* にあるキーMSSQLServerは次のようになります。ここに画像の説明を入力してください

次のすべてのコード行は、レジストリから値を返します。

    var mainKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("MSSQLServer");
    var subKey1 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("MSSQLServer").OpenSubKey("Client");
    var subKey2 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("MSSQLServer").OpenSubKey("MSSQLServer").OpenSubKey("CurrentVersion");

ただし、これはしません:

var subKey3 = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("MSSQLServer").OpenSubKey("Setup");

「セットアップ」は、他のキーと同じタイプの値のように見えます。このコマンドがnullを返す理由はありますか?

4

1 に答える 1

10

アプリケーションは 32 ビットで、これは 64 ビットのレジストリ キーです。32 ビット アプリケーションと 64 ビット アプリケーションでは、レジストリのビューが異なります。regedit では、コードで取得しているキーは HKLM\Software\Wow6432Node\MSSQLServer であり、HKLM\Software\MSSQLServer ではありません (写真の中)。

残念ながら、レジストリ キーにアクセスするためのマネージAPIでは、32 ビット アプリケーションがレジストリの 64 ビット ビューを取得することはできません。

AnyCPU または x64 をターゲットにするようにアプリケーションを変更するか、アンマネージ API をP/Invokeします。これには、P/Invoke とMSDNドキュメントの実行方法の例があります。

ところで、そのようにチェーンする代わりに、OpenSubKey メソッドへのパスを渡すことができます。

更新:上記は完全に正しくありませんでした。.NET 4 以降、OpenBaseKeyメソッド ( MSDN ) を使用して、32 ビット アプリケーションで 64 ビット ビューを取得できます。

于 2012-06-06T17:54:24.240 に答える