web-dev-qa-db-fra.com

Lire une clé de registre

J'ai une application Web qui importe des DLL à partir du dossier bin.

const string dllpath = "Utility.dll";

    [DllImport(dllpath)]

Maintenant, ce que je veux faire, c'est d'abord importer les DLL à partir d'un dossier non pas dans le projet en cours mais à un emplacement différent.

Le chemin de ce dossier est stocké dans une clé de registre.

Comment dois-je procéder?

Modifier :

Pourquoi ne puis-je pas résoudre ce problème ???

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"); ne fonctionne pas ici, mais fonctionne dans l'événement pageload ...

Mais si je fais cela DLL l'importation ne fonctionnera pas ... Comment puis-je résoudre ce problème?

22
user175084

La lecture du registre est assez simple. Le Microsoft.Win32 l'espace de noms a une classe statique Registry. Pour lire une clé du nœud HKLM, le code est:

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

Si le nœud est HKCU, vous pouvez remplacer LocalMachine par CurrentUser.

Une fois que vous avez l'objet RegistryKey, utilisez GetValue pour obtenir la valeur du registre. En utilisant l'exemple ci-dessus, obtenir la valeur de registre pathName serait:

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

Et n'oubliez pas de fermer l'objet RegistryKey lorsque vous en avez terminé (ou de placer l'instruction pour obtenir la valeur dans un bloc Using).

Mises à jour

Je vois deux ou trois choses. Tout d'abord, je changerais pathName pour être une propriété statique définie comme suit:

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

Les deux problèmes étaient les suivants:

  1. La référence RegistryKey gardera le registre ouvert. Son utilisation comme variable statique dans la classe entraînera des problèmes sur l'ordinateur.
  2. Le chemin du registre utilise des barres obliques, pas des barres obliques inverses.
46
Jeff Siver

Aucune de ces réponses n'a fonctionné pour moi. Voici ce que j'ai utilisé:

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
        }
    }
}
9
P.Brian.Mackey

Toutes ces réponses peuvent entraîner des problèmes de fonctionnement sur un système d'exploitation 64 bits - ce qui est habituel de nos jours.

Dans ma situation, je compile vers la cible "N'importe quel processeur" et le logiciel fonctionne correctement lorsque j'installe sur un système d'exploitation 64 bits. Mais mes tests unitaires rencontrent des problèmes - ils sont évidemment exécutés en mode 32 bits.

Dans ce cas, pas le HKEY_LOCAL_MACHINE\SOFTWARE\MyCompany\MySoftware est recherché mais HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\MyCompany\MySoftware mais il n'y a pas d'entrées!

Dans cette situation, nous devons spécifier le point de départ de notre recherche en utilisant

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

Au total, nous pouvons utiliser.

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");
        }
    }
}
5
sahl04
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;
}
2
Zinx

Vous pouvez utiliser ceci:

/// <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;
        }
    }
}

Pour plus d'informations, visitez ce site Web .

1
Mahmut EFE