使用C#获取应用程序的安装版本

3
我希望使用C#获取应用程序的已安装版本(例如,MyApp)。 我会做以下步骤: 1. 为版本5.6的MyApp创建“安装程序”。 2. 安装MyApp。
我将创建另一个应用程序(称为VersionTracker)来获取已安装应用程序的版本。因此,如果我传递名称“MyApp”,我想获得版本号“5.6”。如果系统中安装了另一个应用程序Adobe Reader,则在传递“Adobe Reader”时,我希望能够获取Adobe Reader的版本号。
我需要知道如何构建“VersionTracker”。

2
我们需要更多的细节。你使用的是什么工具,你想要做什么,你已经尝试了什么? - Emond
1
我同意。这个问题非常模糊不清。换句话说,你到底在说什么? - Kevin Wang
你要把名字“MyApp”放在哪里?是在应用程序本身吗?还是在Windows的其他部分?你把它放在哪里?是某个搜索中吗? - Robert Koritnik
3个回答

12

第一而且最重要的是,并不是所有应用程序都在系统中保存它们的版本信息。说实话,只有极少数的应用程序这样做。你应该查找的地方是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");

完成了,您现在已经有了版本。至少有60-80%的几率...

记住! 如果某个关键字或值不存在,则该方法返回null。请记得每次检查返回的值是否为null,否则您的应用程序将崩溃。

想获取更多信息?Code Project: 使用C#读取、写入和删除注册表

我真的希望我能帮到您。如果您想了解其他内容,但我没有理解您的问题,请下次提问更好的问题。 :)


我创建了一个小应用程序,代码可以在http://rauf-thecoder.blogspot.com/2011/07/registry-in-c.html找到。 - mmk_open
1
“我不会为你编写应用程序...” - 哦,当然,你做到了。 :) - Rand Random

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

}

}
}
} 

0

下面的代码基于类似解决方案对我有效:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接