Как прочитать значение ключа реестра C#
При запуске приложения я пытаюсь определить, установлена ли у пользователя определенная версия программного обеспечения, в частности, коннектор MySQL, использующий C#. В реестре MySQL содержится запись о версии. Так что я пытаюсь сделать это.
Мое приложение запускается. Где-то в стартовом коде мне нужно сделать следующие вещи по порядку. Проверьте, есть ли у пользователя установленный соединитель MySQL, который расположен в...
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MySQL AB\MySQL Connector/Net
Если у пользователя установлен соединитель, я хотел проверить, какая у него версия, которая хранится в виде Name = "Version" и Data = xxx (рисунок ниже).
Теперь, если у пользователя установлена конкретная версия, я выполню другой код, который я могу взять.
Что было бы лучшим способом добиться этого?
РЕДАКТИРОВАТЬ: Ниже приведен код, который у меня есть в настоящее время, и я получаю сообщение об ошибке в строке 19 (это комментируется). Моя ошибка говорит "error CS1001: Identifier Expected
"Я не смог понять, что это значит. Любая помощь?
using System;
using Microsoft.Win32;
using System.Data;
public class regTest
{
public static void Main()
{
try
{
RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net");
if (key != null)
{
Object o = key.GetValue("Version");
if (o != null)
{
Version version = new Version(o as String); //"as" because it's REG_SZ...otherwise ToString() might be safe(r)
Version broken = new Version("6.7.4");
if (version.Equals.(broken)) //This is where the error is occuring
{
DataSet dataSet = ConfigurationManager.GetSection("system.data") as ystem.Data.DataSet;
DataView vi = dataSet.Tables[0].DefaultView;
vi.Sort = "Name";
if (vi.Find("MySql") == -1)
{
dataSet.Tables[0].Rows.Add("MySql"
, "MySql.Data.MySqlClient"
, "MySql.Data.MySqlClient"
,
typeof(MySql.Data.MySqlClient.MySqlClientFactory).AssemblyQualifiedName);
}
}
}
}
}
catch (Exception ex) //just for demonstration...it's always best to handle specific exceptions
{
//react appropriately
}
}
}
4 ответа
Вы должны сначала добавить using Microsoft.Win32;
на вашу кодовую страницу.
Тогда вы можете начать использовать Registry
классы:
try
{
using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net"))
{
if (key != null)
{
Object o = key.GetValue("Version");
if (o != null)
{
Version version = new Version(o as String); //"as" because it's REG_SZ...otherwise ToString() might be safe(r)
//do what you like with version
}
}
}
}
catch (Exception ex) //just for demonstration...it's always best to handle specific exceptions
{
//react appropriately
}
ВНИМАНИЕ: если у вас нет прав администратора, вы вряд ли сможете многое сделать в LOCAL_MACHINE
, Иногда даже чтение значений может быть подозрительной операцией без прав администратора.
@DonBoitnott имеет хороший код, но требует прав администратора. Я использую это (требуются только права на чтение)
try
{
using (var key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net", false)) // False is important!
{
var s = key?.GetValue("Version") as string;
if (!string.IsNullOrWhiteSpace(s))
{
var version = new Version(s);
}
}
}
catch (Exception ex) //just for demonstration...it's always best to handle specific exceptions
{
//react appropriately
}
Изменить:
using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net"))
Для того, чтобы:
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Wow6432Node\MySQL AB\MySQL Connector\Net"))
Изменить:
using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\MySQL AB\\MySQL Connector\\Net"))
Для того, чтобы:
using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\Wow6432Node\MySQL AB\MySQL Connector\Net"))