получить установленную версию приложения, используя c # - PullRequest
3 голосов
/ 02 июля 2011

Я хотел бы получить установленную версию приложения (скажем, MyApp), используя C #.Я сделаю это много: 1. Создайте «Настроить» для MyApp версии 5.6 2. Установите MyApp.

Я создам другое приложение (скажем, VersionTracker), чтобы получить версию установленных приложений.Поэтому, если я передам имя «MyApp», я бы хотел получить версию «5.6».Если другое приложение сообщает, что Adobe Reader установлен в моей системе, я хочу получить версию Adobe Reader, если я передаю «Adobe Reader».

Мне нужно знать, как создать «VersionTracker»

Ответы [ 2 ]

12 голосов
/ 02 июля 2011

Первое и самое важное, что не все приложения сохраняют свою версию где-то в системе.Если честно, лишь немногие из них делают это.Место, куда вы должны обратиться, - это реестр Windows.Большинство установленных приложений помещают свои установочные данные в следующее место:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Однако это не так просто - в 64-битной Windows 32-битные (x86) приложения сохраняют свои установочные данные в другой ключ, а именно:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

В этих ключах есть много клавиш, некоторые из них имеют «легко читаемое» имя, например Google Chrome, некоторые из них имеют имена, такие как {63E5CDBF-8214-4F03-84F8-CD3CE48639AD}.Вы должны разобрать все эти ключи в вашем приложении и начать искать имена приложений.Обычно они имеют значение DisplayName, но это не всегда так.Версия приложения обычно имеет значение DisplayVersion, но некоторые установщики используют другие значения, например Inno Setup: Setup Version, ... У некоторых приложений их версия написана на их имени, поэтому возможно, что версия приложения ужев значении DisplayName.

Примечание: Нелегко проанализировать все эти ключи и значения реестра и «выбрать» правильные значения.Не все установщики сохраняют данные приложения в эти ключи, некоторые из них не сохраняют версию приложения там, и так далее.Однако обычно приложение использует эти ключи реестра.[Источник: StackOverflow: обнаружение установленных программ через реестр , просмотр моего собственного реестра]

Хорошо, теперь, когда вы знаете, куда вам следует обратиться, вы должны запрограммировать все это на C #.Я не буду писать приложение для вас, но я скажу вам, какие классы вы должны использовать и как.Во-первых, вам нужно это:

using System;
using Microsoft.Win32;      

Чтобы добраться до вашего HKEY_LOCAL_MACHINE, создайте RegistryKey следующим образом:

RegistryKey baseRegistryKey = Registry.LocalMachine;

Теперь вам нужно определить подключи:

string subKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
// or "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"

Теперь вам нужно перейти к подразделу, поэтому создайте новый RegistryKey:

RegistryKey uninstallKey = baseRegistryKey.OpenSubKey(subKey);

Теперь вам нужно пройти через все подключи, которые есть, поэтому сначала мы получимимена всех подразделов:

string[] allApplications = uninstallKey.GetSubKeyNames();

Теперь вы должны пройти через все подразделы самостоятельно , один за другим, создав новый раздел реестра (вам не нужно, ноЯ сделаю это):

RegistryKey appKey = baseRegistryKey.OpenSubKey(subKey + "\\" + applicationSubKeyName);

где applicationSubKeyName - имя подключа, который вы проверяете в данный момент.Я рекомендую заявление foreach, которое вам поможет (однако вы уже должны иметь некоторый опыт работы с C #, я не буду рассказывать вам, как использовать foreach здесь).

Теперь проверьте имя приложения исравните его с именем нужного приложения (вы не можете полагаться на имя подключа, потому что, как я уже сказал, они могут быть вызваны, например, {63E5CDBF-8214-4F03-84F8-CD3CE48639AD}, поэтому вы должны проверить имя здесь):

string appName = (string)appKey.GetValue("DisplayName");

Если это правильное приложение (вы должны проверить его самостоятельно), найдите версию:

string appVersion = (string)appKey.GetValue("DisplayVersion");

Et voilà, у вас есть версия.По крайней мере, вероятность того, что у вас будет 60-80% ...

Помните! Если какой-либо ключ или значение не существует, метод возвращает null.Не забывайте проверять, является ли возвращаемое значение нулевым каждый раз, иначе ваше приложение будет аварийно завершать работу.

Где найти больше? Проект кода: чтение, запись и удаление из реестра с помощью C #

Я действительно надеюсь, что помог вам.А если вы хотели узнать что-то еще, а я не поняла ваш вопрос, то, пожалуйста, спросите лучше в следующий раз.:)

2 голосов
/ 04 июля 2011
    ///
/// Author : Muhammed Rauf K
/// Date : 03/07/2011
/// A Simple console application to create and display registry sub keys
///

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

// it's required for reading/writing into the registry:
using Microsoft.Win32;


namespace InstallationInfoConsole
{
class Program
{
static void Main(string[] args)
{

Console.WriteLine("Registry Information ver 1.0");
Console.WriteLine("----------------------------");

Console.Write("Input application name to get the version info. (for example 'Nokia PC Suite'): ");
string nameToSearch = Console.ReadLine();

GetVersion(nameToSearch);

Console.WriteLine("----------------------------");

Console.ReadKey();


}

///
/// Author : Muhammed Rauf K
/// Date : 03/07/2011
/// Create registry items
///
static void Create()
{
try
{
Console.WriteLine("Creating registry...");
// Create a subkey named Test9999 under HKEY_CURRENT_USER.
string subKey;
Console.Write("Input registry sub key :");
subKey = Console.ReadLine();
RegistryKey testKey = Registry.CurrentUser.CreateSubKey(subKey);
Console.WriteLine("Created sub key {0}", subKey);
Console.WriteLine();

// Create two subkeys under HKEY_CURRENT_USER\Test9999. The
// keys are disposed when execution exits the using statement.
Console.Write("Input registry sub key 1:");
subKey = Console.ReadLine();
using (RegistryKey testKey1 = testKey.CreateSubKey(subKey))
{
testKey1.SetValue("name", "Justin");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
static void GetVersion(string nameToSearch)
{
// Get HKEY_LOCAL_MACHINE
RegistryKey baseRegistryKey = Registry.LocalMachine;

// If 32-bit OS
string subKey
//= "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
// If 64-bit OS
= "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
RegistryKey unistallKey = baseRegistryKey.OpenSubKey(subKey);

string[] allApplications = unistallKey.GetSubKeyNames();
foreach (string s in allApplications)
{
RegistryKey appKey = baseRegistryKey.OpenSubKey(subKey + "\\" + s);
string appName = (string)appKey.GetValue("DisplayName");
if(appName==nameToSearch)
{
string appVersion = (string)appKey.GetValue("DisplayVersion");
Console.WriteLine("Name:{0}, Version{1}", appName, appVersion);
break;
}


}

}

static void ListAll()
{
// Get HKEY_LOCAL_MACHINE
RegistryKey baseRegistryKey = Registry.LocalMachine;

// If 32-bit OS
string subKey
//= "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
// If 64-bit OS
= "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
RegistryKey unistallKey = baseRegistryKey.OpenSubKey(subKey);

string[] allApplications = unistallKey.GetSubKeyNames();
foreach (string s in allApplications)
{
RegistryKey appKey = baseRegistryKey.OpenSubKey(subKey + "\\" + s);
string appName = (string)appKey.GetValue("DisplayName");
string appVersion = (string)appKey.GetValue("DisplayVersion");
Console.WriteLine("Name:{0}, Version{1}", appName, appVersion);

}

}
}
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...