2017-01-09 2 views
1

Ich habe mehrere Posts darüber gelesen, wie man den Wert des Registrierungsschlüssels hier liest, und ich denke, dass ich alles richtig mache, aber der Schlüssel, den ich in meinem Fall lese, ist aus irgendeinem Grund immer Null .C# Lesen des Registrierungsschlüssels/Wertes, Schlüssel ist immer NULL

In HKLM \ SOFTWARE, I-Taste MyCompany erstellt und dann innerhalb dieser Schlüssel, habe ich einen anderen Schlüssel MyApp wie: HKLM \ SOFTWARE \ MyCompany \ MyApp

In diesem Schlüssel, fügte ich MySetting einen String String-Wert“ "

ich versuche, diesen Wert mit folgendem Code zu lesen:

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

aber der Schlüssel ist immer null, obwohl ich diese Schlüssel und Wert habe oben an der Stelle gesetzt. Irgendeine Idee, was ich falsch mache?

Ich bekomme System.NullReferenceException wurde unbehandelt Ausnahme weil Schlüssel immer Null ist.

SOLUTION

Dank Luke Merrett unten beantworten, ich die Position meiner ändern in HKLM \ SOFTWARE \ WOW6432Node und das funktionierte zu sein. Danke Luke

+0

Haben Sie die Berechtigung, den Registrierungsschlüssel zu lesen? –

+0

Ich weiß es nicht. Wie finde ich das heraus und erhalte die Erlaubnis? – cd491415

+0

Eine einfache Möglichkeit, um festzustellen, ob dies das Problem ist, wäre, Ihre App als Administrator zu betreiben. Wenn es auf diese Weise erfolgreich ausgeführt wird, ist das Problem wahrscheinlich das Problem. In diesem Fall müssen Sie sicherstellen, dass der Prinzipal, in dem die App ausgeführt wird, Berechtigungen zum Lesen des spezifischen Registrierungsschlüssels hat. –

Antwort

2

Wie Steve angedeutet, kann es ein x86 vs x64 Problem sein. Ich habe deinen Code lokal reproduziert und wenn er unter x86 ausgeführt wurde, war mein Schlüssel immer null. Durch den Wechsel zu x64 konnte ich auf den Schlüssel zugreifen.

Sie können das Ziel unter Projekteigenschaften ändern -> hier Körperbau:

enter image description here

There's some more detail on this here if you explicitly need an x86 key. Alternativ können Sie %systemroot%\syswow64\regedit ausführen, um x86-Schlüssel hinzuzufügen und zu bearbeiten.

Als Referenz; das funktioniert sowohl als Admin als auch als Standardbenutzer

+0

Plattform Ziel in meinem Fall ist AnyCPU – cd491415

+0

Dank Luke. Ich habe meinen Registrierungsschlüssel unter HKLM \ SOFTWARE \ WOW6432Node \ MyCompany \ MyApp verschoben, und das hat funktioniert. Ich denke, deine Antwort hat mich zur Lösung geführt. Danke ~ – cd491415

1

Ich glaube, dieser Artikel beantwortet Ihre Frage am besten. Reading 64bit Registry from a 32bit application

Ich hatte ein Problem, wo ich die Anwendung unter 32bit ausführen musste, keine CPU. Aus diesem Grund bekam ich NULL, weil es den Pfad nicht finden konnte. Ich habe einen IF/THEN-Wrapper erstellt, um zu bestimmen, welcher Schlüssel verwendet werden soll.

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(); 

Das löste mein Problem und erlaubte die Flexibilität. WENN ich es nur unter "Any CPU" laufen ließ, war das kein Problem. Aber für dieses Programm musste ich festlegen, unter welcher CPU ich gerade arbeitete, weil eine Komponente davon nur im 32-Bit-Modus ausgeführt werden musste.