我希望使用C#安装应用程序的版本(例如,MyApp)。 我会这么做的, 1.为MyApp 5.6版创建“设置” 2.安装MyApp。
我将创建另一个应用程序(比如VersionTracker)来获取已安装应用程序的版本。因此,如果我传递名称“MyApp”,我希望将版本设为“5.6”。如果另一个应用程序说我的系统中安装了Adobe Reader,如果我通过'Adobe Reader',我想获得Adobe Reader的版本。
我需要知道如何构建'VersionTracker'
答案 0 :(得分: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: 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");
Etvoilà,你有版本。至少有60%-80%的可能性......
请记住!如果某个键或值不存在,则该方法返回null
。请记住每次检查返回的值是否为null,否则应用程序将崩溃。
在哪里可以找到更多? The Code Project: Read, write and delete from registry with C#
我真的希望我能帮到你。如果你想知道别的东西,我不明白你的问题,那么,请下次再问。 :)
答案 1 :(得分: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);
}
}
}
}
答案 2 :(得分:0)
下一个基于 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;
}