2011-07-02 164 views
2

我將使用C#獲取應用程序的安裝版本(比如MyApp)。 我會做這麼多, 1.爲5.6版MyApp創建'設置' 2.安裝MyApp。使用C#獲取已安裝的應用程序版本

我將創建另一個應用程序(說VersionTracker)來獲取已安裝的應用程序的版本。所以如果我通過'MyApp'這個名字,我想把版本設置爲'5.6'。如果另一個應用程序說我的系統中安裝了Adobe Reader,如果我通過'Adobe Reader',我想要得到Adobe Reader的版本。

我需要知道如何建立「VersionTracker」

+2

我們需要更多的細節。你在用什麼工具,你到底想要做什麼,你嘗試過什麼? –

+1

我同意。這個問題非常模糊。換句話說,跆拳道你在說什麼? –

+0

您將名稱「MyApp」傳遞到哪裏?在應用程序本身?在Windows的其他部分?你把這個名字放在哪裏?一些搜索? –

回答

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

的Et瞧,你擁有的版本。至少有60-80%的機會你有...

記住!如果某個鍵或值不存在,則該方法返回null。請記住檢查每次返回的值是否爲空,否則應用程序將崩潰。

哪裏可以找到更多? The Code Project: Read, write and delete from registry with C#

我真的很希望我幫你。如果你想知道其他的東西,但是我不明白你的問題,那麼請下次再提問。 :)

+0

我創建了一個小應用程序,代碼可以在http://rauf-thecoder.blogspot.com/2011/07/registry-in-c.html –

+1

找到Quote:「我不會爲你寫應用程序。 ..「 - 哦,確定你做到了。 :) –

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

你至少可以縮進你的代碼。 – Torxed

相關問題