2011-07-02 10 views
2

C#を使用してアプリケーションのインストールバージョン(MyAppなど)を取得します。 私はこれを多くします 1.バージョン5.6のMyAppのために 'Set Up'を作成します 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(); 

あなたは、すべてのサブキー自分スルー一つ一つを行かなければなりません、新しいレジストリキーを作成することによって、(あなたがする必要はありませんが、私はそれをやる):

applicationSubKeyNameあなたが現在チェックしているサブキーの名前です
RegistryKey appKey = baseRegistryKey.OpenSubKey(subKey + "\\" + 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#

本当に助けてくれることを願っています。あなたが何か他のものを知りたいと思っていて、私があなたの質問を理解できなかったなら、次回はよく聞いてください。 :)

+0

小さなアプリケーションを作成しました。http://rauf-thecoder.blogspot.com/2011/07/registry-in-c.html –

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

} 

} 
} 
} 
+0

少なくともどこかでコードをインデントすることができます。 – Torxed

関連する問題