中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【C#.net】windowsにインストールされているアプリケーションのバージョンを取得する

1.概要

インストーラーを使ってインストールされたアプリケーションは
レジストリにその情報が登録されています。
【コントロールパネル】にある【プログラムと機能】の一覧にあるアプリケーションのバージョン情報を
C#.netから取得することでアプリケーションのバージョン管理に役立つかと思います。

開発環境:visual studio 2015
開発言語:C#.net

2.レジストリ

どこにアプリケーションの情報が登録されているのかというと2パターンに分かれます。

【32bit環境、または64bit環境で64bitアプリケーションのインストールした場合】
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

【64bit環境で32bitアプリケーションをインストールした場合】
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall

上記に登録されています。

3.原理

どうやってバージョン情報を取得するかというと
レジストリキーの【DisplayName】を取得し
【DisplayName】とバージョンが知りたいアプリケーション名が一致したら
レジストリキーの【DisplayVersion】をさらに取得します。

f:id:tsu--kun:20190724170951p:plain

レジストリから値を取得するには【Microsoft.Win32.RegistryKey】クラスを使用します。

4.スクリプト

任意のフォームアプリケーションプロジェクトを作成し
バージョンを取得したいアプリケーションを設定します。
今回は
【Microsoft Visual Studio Professional 2015 - 日本語】
にしています。
結果はメッセージボックスに出力されます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace getAppVersion
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string versionInfo = getAppVersiont("Microsoft Visual Studio Professional 2015 - 日本語");
            MessageBox.Show(versionInfo);

        }

        private string getAppVersiont(string appName)
        {
            string ver = "";

            string wkKeyName = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
            Microsoft.Win32.RegistryKey wkRegKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(wkKeyName, false);
            if (wkRegKey != null)
            {
                foreach (string subKey in wkRegKey.GetSubKeyNames())
                {
                    Microsoft.Win32.RegistryKey appkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(wkKeyName + "\\" + subKey, false);

                    if (appkey.GetValue("DisplayName") != null)
                    {
                        if (appName == appkey.GetValue("DisplayName").ToString())
                        {
                            if (appkey.GetValue("DisplayVersion") != null)
                            {
                                ver = appkey.GetValue("DisplayVersion").ToString();
                                
                            }else
                            {
                                ver = "バージョン情報が取得出来ませんでした。";
                               
                            }
                            break;
                        }
                    }
                }
            }
            return ver;
        }
    }
}

5.結果

f:id:tsu--kun:20190724170928p:plain

バージョン情報が出力されました。