2009-11-04 9 views
20

Ich habe eine Webanwendung, die DLLs aus dem Ordner bin importiert.Lesen Sie einen Registrierungsschlüssel

const string dllpath = "Utility.dll"; 

    [DllImport(dllpath)] 

Nun, was ich tun möchte, ist Erstimport die DLLs aus einem Ordner nicht in dem aktuellen Projekt aber an einem gewissen anderen Ort.

Der Pfad dieses Ordners wird in einem Registrierungsschlüssel gespeichert.

Wie soll ich das tun?

bearbeiten:

Warum kann ich nicht das funktionieren ???

public partial class Reports1 : System.Web.UI.Page 
{ 

    RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(@"Software\xyz"); 
    string pathName = (string)registryKey.GetValue("BinDir"); 

    const string dllpath = pathName; 
    [DllImport(dllpath)] 
    public static extern bool GetErrorString(uint lookupCode, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder buf, uint bufSize); 

    protected void Page_Load(object sender, EventArgs e) 
    { 

string pathName = (string)registryKey.GetValue("BinDir"); arbeitet nicht hier, sondern in dem Pageload-Ereignisse arbeitet ...

Aber wenn ich diesen DLL-Import kann nicht funktionieren ... Wie kann ich dieses Problem beheben?

Antwort

43

Das Lesen der Registrierung ist ziemlich einfach. Der -Namespace hat eine Registry statische Klasse. Um einen Schlüssel aus dem HKLM Knoten gelesen, der Code ist:

RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software\\NodeName") 

Wenn der Knoten HKCU ist, Sie LocalMachine mit CurrentUser ersetzen kann. Wenn Sie das Objekt RegistryKey haben, verwenden Sie GetValue, um den Wert aus der Registrierung abzurufen. Fortsetzung des obigen Beispiels verwenden, wäre die pathName Registrierungswert bekommen:

string pathName = (string) registryKey.GetValue("pathName"); 

Und vergessen Sie nicht das RegistryKey Objekt zu schließen, wenn Sie mit ihm (oder legen Sie die Aussage gemacht werden, um den Wert in einen Using Block zu erhalten).

Updates

Ich sehe ein paar Dinge. Zuerst würde ich pathName ändern eine statische Eigenschaft definiert werden als:

Private static string PathName 
{ 
    get 
    { 
     using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(@"Software\Copium")) 
     { 
       return (string)registryKey.GetValue("BinDir"); 
     } 
    } 
} 

Die beiden Themen waren:

  1. Die RegistryKey Referenz der Registrierung offen halten. Wenn Sie dies als statische Variable in der Klasse verwenden, werden Probleme auf dem Computer verursacht.
  2. Registry-Pfad verwenden Vorwärts Schrägstriche, nicht Back Schrägstriche.
2
try 
{ 
    RegistryKey regKey = Registry.LocalMachine; 
    regKey = regKey.OpenSubKey(@"Software\Application\"); 

    if (regKey != null) 
    { 
     return regKey.GetValue("KEY NAME").ToString(); 
    } 
    else 
    { 
     return null; 
    } 
} 
catch (Exception ex) 
{ 
    return null; 
} 
1

Sie können diese verwenden:

/// <summary> 
/// To read a registry key. 
/// input: KeyName (string) 
/// output: value (string) 
/// </summary> 
public string Read(string KeyName) 
{ 
    // Opening the registry key 
    RegistryKey rk = baseRegistryKey ; 
    // Open a subKey as read-only 
    RegistryKey sk1 = rk.OpenSubKey(subKey); 
    // If the RegistrySubKey doesn't exist -> (null) 
    if (sk1 == null) 
    { 
     return null; 
    } 
    else 
    { 
     try 
     { 
      // If the RegistryKey exists I get its value 
      // or null is returned. 
      return (string)sk1.GetValue(KeyName.ToUpper()); 
     } 
     catch (Exception e) 
     { 
      // AAAAAAAAAAARGH, an error! 
      ShowErrorMessage(e, "Reading registry " + KeyName.ToUpper()); 
      return null; 
     } 
    } 
} 

Für weitere Informationen besuchen this web site.

8

Keine dieser Antworten funktionierte für mich.Das habe ich benutzt:

static void Main() 
{ 
    const string dotNetFourPath = "Software\\Microsoft";//note backslash 
    using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(dotNetFourPath)) 
    { 
     Console.WriteLine(registryKey.SubKeyCount);//registry is not null 
     foreach (var VARIABLE in registryKey.GetSubKeyNames()) 
     { 
      Console.WriteLine(VARIABLE);//here I can see I have many keys 
      //no need to switch to x64 as suggested on other posts 
     } 
    } 
} 
2

All diese Antworten können zu Problemen führen, die auf 64bit OS laufen - was heutzutage üblich ist.

In meiner Situation kompiliere ich auf "Any CPU" -Ziel und die Software funktioniert gut, wenn ich auf 64-Bit-Betriebssystem installieren. Aber meine Komponententests laufen auf Probleme - offensichtlich werden sie im 32bit-Modus ausgeführt.

In diesem Fall wird nicht die HKEY_LOCAL_MACHINE\SOFTWARE\MyCompany\MySoftware gesucht, sondern HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\MyCompany\MySoftware, aber es gibt keine Einträge!

In dieser Situation müssen wir den Startpunkt unserer Suche angeben

RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) 

Insgesamt verwenden wir verwenden können.

string configurationDirectory = string.Empty; 

using (RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) 
{ 
    using (RegistryKey registryKey = hklm.OpenSubKey(@"SOFTWARE\MyCompany\MySoftware")) 
    { 
     if (registryKey != null) 
     { 
      configurationDirectory = (string)registryKey.GetValue("ConfigurationDirectory"); 
     } 
    } 
}