2017-01-09 6 views
1

ここでレジストリキー値を読み取る方法についていくつかの記事を見ましたが、私はそれをすべてやっていると思いますが、私のケースで読んだキーは何らかの理由。 HKLM \ソフトウェアのC#レジストリキー/値の読み取り、キーは常にNULLです

は、私はキーのMyCompanyを作成し、そのキーの中に、私は別のキーMyAppのように作成:このキーでは HKLM \ SOFTWARE \ MyCompanyの\ MyAppの

を、私はMySetting」文字列の文字列値を追加しました「私は、次のコードを使用して、その値の読み取りしようとしています

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MyCompany\MyApp", false)) 
{ 
    string spaUrl = (String)key.GetValue("MySetting"); 
} 

をしかしキーは、私は上記の場所に設定し、これらのキーと値を持っているにもかかわらず、常にnullです。私が間違って何をしているのか?

キーが常にnullであるため、System.NullReferenceExceptionが処理されない例外を受け取ることがあります。

SOLUTION

ルークMerrettのおかげで、以下の答え私はHKLM \ SOFTWARE \ WOW6432NODEにあるように、私のキーの位置を変更し、それが働きました。おかげでルーク

+0

レジストリキーを読む権限がありますか? –

+0

私は知らない。それを理解して許可を得るにはどうすればいいですか? – cd491415

+0

これが問題かどうかを判断する簡単な方法は、あなたのアプリを管理者として実行することです。この方法で実行すると、呼び出しが成功する可能性が高くなります。その場合、アプリケーションが実行されているプリンシパルが特定のレジストリキーを読み取るためのアクセス権を持っていることを確認する必要があります –

答えて

2

スティーブが指摘したように、それはx86 vs x64の問題かもしれません。私はあなたのコードをローカルで再現しました。そして、x86の下で走っているとき、私の鍵は常にnullでしたそれをx64に変更すると、私はそのキーにアクセスすることができました。

あなたは、プロジェクトのプロパティの下にターゲットを変更することができます - >ここでビルドします。

enter image description here

There's some more detail on this here if you explicitly need an x86 keyを。または、%systemroot%\syswow64\regeditを実行してx86キーを追加および編集することもできます。

参考までに、これは管理者としても標準ユーザーとして実行しても動作します

+0

私の場合のプラットフォームターゲットはAnyCPUです – cd491415

+0

ありがとうございます。私はHKLM \ SOFTWARE \ WOW6432Node \ MyCompany \ MyAppの下に私のレジストリキーを移動し、それが働いた。あなたの答えは私を解決に導いてくれると思います。ありがとう〜 – cd491415

1

私はこの記事があなたの質問に最もよく答えると感じます。 Reading 64bit Registry from a 32bit application

私は32ビットでアプリケーションを実行しなければならない問題がありました。そのため、パスを見つけることができなかったため、NULLを取得し続けました。 IF/THENラッパーを作成して、使用するキーを判別できるようにしました。

RegistryKey localMachine; 
if (Directory.Exists("C:\\Windows\\SysWOW64")) 
    { localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); } 
else { localMachine = Registry.LocalMachine; } 

string productsRoot = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"; 
RegistryKey products = localMachine.OpenSubKey(productsRoot); 
string[] productFolders = products.GetSubKeyNames(); 

これは私の問題を解決し、柔軟性を可能にしました。私が「Any CPU」の下で実行していたのであれば問題ではありませんでした。しかし、このプログラムでは、そのコンポーネントが32ビットモードでのみ動作する必要があったため、どのCPUが動作しているかを特定する必要がありました。

関連する問題