我会使用C#获取应用程序(比如MyApp)的安装版本。我会做这么多,1.为5.6版本的MyApp创建一个‘设置’2.安装MyApp。
我将创建另一个应用程序(比如VersionTracker)来获取已安装应用程序的版本。因此,如果我传递名称'MyApp‘,我希望将版本设置为'5.6’。如果另一个应用程序显示Adobe Reader已安装在我的系统中,如果我通过'Adobe Reader‘,我希望获得Adobe Reader的版本。
我需要知道如何构建'VersionTracker‘
发布于 2011-07-02 22:18:37
首先,也是最重要的一点是,并不是所有的应用程序都会将其版本保存在系统中的某个位置。老实说,他们中只有少数人这样做。您应该查看的地方是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: Detecting installed programs via registry,浏览我自己的注册表]
好了,现在当你知道应该往哪里看的时候,你必须用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,否则您的应用程序将崩溃。
哪里可以找到更多?The Code Project: Read, write and delete from registry with C#
我真希望我能帮到你。如果你想知道其他事情,而我不明白你的问题,那么,请下次问得更好。:)
发布于 2011-07-04 12:48:13
///
/// 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);
}
}
}
} 发布于 2021-04-25 23:35:27
下一个基于similar solution的代码对我来说是有效的:
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;
}https://stackoverflow.com/questions/6555561
复制相似问题