2012-08-04 10 views
26

Ich versuche, ein paar einfache Registry-Schlüssel mit Microsoft.Win32.RegistryKey in C# aber der Pfad ändert sich automatisch aus einzufügen:Vermeiden Registry Wow6432Node Redirection

HKEY_LOCAL_MACHINE\SOFTWARE\Test 

zu

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Test 

ich google versucht aber ich bekomme nur einige vage und verwirrende Ergebnisse. Hat sich jemand schon einmal mit diesem Thema beschäftigt? Ein Beispielcode wäre sehr erwünscht.

+1

möglich Duplikat [Visual Studio 2010 Setup-Projekt 64-Bit-Registrierungsschlüssel Ausgabe erstellen] (http://stackoverflow.com/questions/7384270/visual-studio-2010-setup-project-64-bit-create-registry-key-issue) –

Antwort

24

können Sie RegistryKey.OpenBaseKey verwenden, dieses Problem zu lösen:

var baseReg = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 
var reg = baseReg.CreateSubKey("Software\\Test"); 
+5

nur in .NET 4+ – Kevin

+0

Ich suchte nach einem Beispiel für die Verwendung von RegistryView.Registry64 und fand es zufällig hier. Keines der M $ Docs hat ein Beispiel, sie sagen nur, es zu benutzen. Meine beliebige CPU-App hat die wow6432uninstall gelesen, als ich ihr gesagt habe, dass sie die normale Deinstallation lesen soll. Dies ist die Lösung – sdjuan

+2

Vergessen Sie nicht, baseReg zu entsorgen! mit (var baseReg = ...) {..} –

7

Unter WOW64 werden bestimmte Registrierungsschlüssel umgeleitet (SOFTWARE). Wenn eine 32-Bit- oder 64-Bitanwendung einen Registrierungsaufruf für einen umgeleiteten Schlüssel ausführt, fängt der Registrierungsredirector den Aufruf ab und ordnet ihn dem entsprechenden physischen Registrierungsspeicherort des Schlüssels zu. Weitere Informationen finden Sie unter Registry Redirector.

Sie können die RegistryView Enumeration unter RegistryKey.OpenBaseKey Method verwenden, um die 32-Bit-Ansicht explizit zu öffnen und direkt auf HKLM \ Software \ zuzugreifen.

+0

nur im .net 4+ Framework, was ist mit .net 3.5 Anwendungen ? – Kevin

+2

@Kevin Vor .Net 4 müssen Sie die native API [RegOpenKeyEx] (https://msdn.microsoft.com/en-us/library/ms724897 (VS.85) .aspx) aufrufen, die einen der [KEY_WOW64_32KEY oder KEY_WOW64_64KEY] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa384129 (v = V.85) .aspx) -Flags wie erforderlich. –

10

Ich weiß nicht, wie es mit einer Reg-Datei zu lösen. Aber nur in einer BAT-Datei, wie folgt:

Sie müssen /reg:64 am Ende der Befehlszeile hinzufügen. ex:

REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background" /v "OEMBackground" /t REG_DWORD /d 0x00000001 /f /reg:64 

Quelle: Wow6432Node and how to Deploy Registry settings to 64 bit systems via Sccm

+0

Schön! Genau das, was ich gesucht habe, Danke. – Ron

0

Hier ist der Arbeits Code, den ich sowohl entwickelt haben, lesen und schreiben nur die 32-Bit-Registrierung. Es funktioniert in 32-Bit- und 64-Bit-Anwendungen. Der 'read'-Aufruf aktualisiert die Registrierung, wenn der Wert nicht festgelegt ist, aber es ist sehr offensichtlich, wie dieser entfernt wird. Es erfordert .NET 4.0 und verwendet die OpenBaseKey/OpenSubKey-Methoden.

Ich verwende es derzeit, um einen 64-Bit-Hintergrunddienst und eine 32-Bit-Tray-Anwendung nahtlos auf dieselben Registrierungsschlüssel zugreifen zu können.

using Microsoft.Win32; 

namespace SimpleSettings 
{ 
public class Settings 
{ 
    private static string RegistrySubKey = @"SOFTWARE\BlahCompany\BlahApp"; 

    public static void write(string setting, string value) 
    { 
     using (RegistryKey registryView = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)) 
     using (RegistryKey registryCreate = registryView.CreateSubKey(RegistrySubKey)) 
     using (RegistryKey registryKey = registryView.OpenSubKey(RegistrySubKey, true)) 
     { 
      registryKey.SetValue(setting, value, RegistryValueKind.String); 
     }   
    } 
    public static string read(string setting, string def) 
    { 
     string output = string.Empty; 
     using (RegistryKey registryView = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)) 
     using (RegistryKey registryCreate = registryView.CreateSubKey(RegistrySubKey)) 
     using (RegistryKey registryKey = registryView.OpenSubKey(RegistrySubKey, false)) 
     { 
      // Read the registry, but if it is blank, update the registry and return the default. 
      output = (string)registryKey.GetValue(setting, string.Empty); 
      if (string.IsNullOrWhiteSpace(output)) 
      { 
       output = def; 
       write(setting, def); 
      } 
     } 
     return output; 
    } 
} 
} 

Verbrauch: diese in seiner eigenen Klassendatei (CS-) und sich als solche bezeichnen:

using SimpleSettings; 
string mysetting = Settings.read("SETTINGNAME","DEFAULTVALUE");