开发者

get installed version of an application using c#

I would to get inst开发者_运维技巧alled version of an application (say, MyApp) using C#. I will do this much, 1. Create a 'Set Up' for MyApp of version 5.6 2. Install MyApp.

I will create another application (say VersionTracker)to get the version of installed applications. So if I pass the name 'MyApp' I would like to get the version as '5.6'. If another application say Adobe Reader is installed in my system, I want to get the version of Adobe Reader if I pass 'Adobe Reader'.

I need to know how to build 'VersionTracker'


The first and the most important thing is that not all applications do save their version somewhere in the system. To be honest, only a few of them do that. The place where you should look are the Windows Registry. Most of installed applications put their installation data into the following place:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

However, it's not that easy - on 64bit Windows, the 32bit (x86) applications save their installation data into another key, which is:

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

In these keys there are many keys, some of them have got "easy-readable" name, such as Google Chrome, some of them got names such as {63E5CDBF-8214-4F03-84F8-CD3CE48639AD}. You must parse all these keys into your application and start looking for the application names. There are usually in DisplayName value, but it's not always true. The version of the application is usually in DisplayVersion value, but some installers do use another values, such as Inno Setup: Setup Version, ... Some application do have their version written in their name, so it's possible that the application version is already in the DisplayName value.

Note: It's not easy to parse all these registry keys and values and to "pick" the correct values. Not all installers save the application data into these keys, some of them do not save the application version there, etcetera. However, it's usual that the application use these registry keys. [Source: StackOverflow: Detecting installed programs via registry, browsing my own registry]

Alright, so now when you know where you should look, you have to program it all in C#. I won't write the application for you, but I'll tell you what classes you should use and how to. First, you need these:

using System;
using Microsoft.Win32;      

To get to your HKEY_LOCAL_MACHINE, create a RegistryKey like this:

RegistryKey baseRegistryKey = Registry.LocalMachine;

Now you need to define subkeys:

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

Now you need to go to the subkey, so create a new RegistryKey:

RegistryKey uninstallKey = baseRegistryKey.OpenSubKey(subKey);

Now you need to go thru all the subkeys that are there, so first we get the names of all the subkeys:

string[] allApplications = uninstallKey.GetSubKeyNames();

Now you must go thru all the subkeys yourself, one by one, by creating a new registry key (you don't have to, but I'll do it):

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

where applicationSubKeyName is the name of the subkey you're currently checking. I recommend foreach statement, which helps you (you must however have some experience with C# already, I'm not going to tell you how to use foreach here).

Now check the application's name and compare it with name of your desired application (you cannot rely on the subkey name, because, as I already said, they can be called for example {63E5CDBF-8214-4F03-84F8-CD3CE48639AD}, so you must check the name here):

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

If it's the correct application (you must check it yourself), find the version:

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

Et voilà, you have the version. At least there's like a 60 - 80% chance you have...

Remember! If some key or value doesn't exist, the method returns null. Remember to check if the returned value is null everytime, otherwise your application will crash.

Where to find more? The Code Project: Read, write and delete from registry with C#

I really hope I helped you. And if you wanted to know something else and I didn't understand your question, then, please, ask better next time. :)


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

}

}
}
} 


Next code base on similar solution is working for me:

var version = GetApplicationVersion("Windows Application Driver");

string GetApplicationVersion(string appName)
{
    string displayName;

    // search in: CurrentUser
    var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
    foreach (var keyName in key.GetSubKeyNames())
    {
        var subKey = key.OpenSubKey(keyName);
        displayName = subKey.GetValue("DisplayName") as string;
        if (appName.Equals(displayName, StringComparison.OrdinalIgnoreCase))
            return subKey.GetValue("DisplayVersion").ToString();
    }

    // search in: LocalMachine_32
    key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
    foreach (var keyName in key.GetSubKeyNames())
    {
        var subKey = key.OpenSubKey(keyName);
        displayName = subKey.GetValue("DisplayName") as string;
        if (appName.Equals(displayName, StringComparison.OrdinalIgnoreCase))
            return subKey.GetValue("DisplayVersion").ToString();
    }

    // search in: LocalMachine_64
    key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
    foreach (var keyName in key.GetSubKeyNames())
    {
        var subKey = key.OpenSubKey(keyName);
        displayName = subKey.GetValue("DisplayName") as string;
        if (appName.Equals(displayName, StringComparison.OrdinalIgnoreCase))
            return subKey.GetValue("DisplayVersion").ToString();
    }

    // NOT FOUND
    return null;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜