Чтение ключа реестра
У меня есть веб-приложение, которое импортирует библиотеки 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, это не сработает...
Как я могу это исправить?
Ответы
Ответ 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;
}
}
}
Для получения дополнительной информации посетите этот веб-сайт.