Подтвердить что ты не робот

Чтение ключа реестра

У меня есть веб-приложение, которое импортирует библиотеки DLL из папки bin.

const string dllpath = "Utility.dll";

    [DllImport(dllpath)]

Теперь то, что я хочу сделать, это сначала импортировать библиотеки DLL из папки не в текущем проекте, а в другом месте.

Путь к этой папке сохраняется в разделе реестра.

Как мне это сделать?

Edit

Почему я не могу это решить?

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"); здесь не работает, но работает в событии pageload...

Но если я сделаю этот импорт DLL, это не сработает... Как я могу это исправить?

4b9b3361

Ответ 1

Чтение реестра довольно просто. Пространство имен Microsoft.Win32 имеет статический класс Registry. Чтобы прочитать ключ из HKLM node, код:

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

Если node - HKCU, вы можете заменить LocalMachine на CurrentUser.

Как только у вас есть объект RegistryKey, используйте GetValue, чтобы получить значение из реестра. Продолжение. Используя приведенный выше пример, получение значения реестра pathName будет следующим:

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

И не забудьте закрыть объект RegistryKey, когда вы закончите с ним (или поместите оператор, чтобы получить значение в блок Using).

Обновление

Я вижу пару вещей. Во-первых, я бы изменил pathName как статическое свойство, определенное как:

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

Два вопроса:

  • Ссылка RegistryKey приведет к открытию реестра. Использование этого в качестве статической переменной в классе вызовет проблемы на компьютере.
  • Путь к реестру использует косые черты, а не обратные косые черты.

Ответ 2

Ни один из этих ответов не работал у меня. Это то, что я использовал:

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

Ответ 3

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

Ответ 4

Все эти ответы могут привести к проблемам, выполняемым на 64-битной ОС, что обычно является обычным в настоящее время.

В моей ситуации я компилирую цель "Любой процессор", и программное обеспечение отлично работает, когда я устанавливаю на 64-битную ОС. Но мои модульные тесты сталкиваются с проблемами - очевидно, они выполняются в 32-битном режиме.

В этом случае не выполняется поиск HKEY_LOCAL_MACHINE\SOFTWARE\MyCompany\MySoftware, но HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\MyCompany\MySoftware, но нет записей!

В этой ситуации мы должны указать начальную точку нашего поиска, используя

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

В общей сложности мы можем использовать.

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

Вы можете использовать это:

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

Для получения дополнительной информации посетите этот веб-сайт.