2016年9月15日木曜日

【C#】ロードされたdllやexeのバージョン

■ConsoleApplicationプロジェクト(.exeを出力する)が実行ファイルで、そのConsoleApplicationプロジェクトからCommonプロジェクト(.dllを出力する)を参照しているとする。
(以下のようなプロジェクト構成)


このプロジェクト構成で、Common.dllとConsoleApplication.exeのバージョンを出力したい。

・コード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using Common;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            // Common.dllの読み込み。
            Assembly.Load(new AssemblyName("Common"));

            // バージョン出力したい .exe .dllのAssemblyクラスのオブジェクトを取得。
            var assemblyStrs = new string[] { "Common", "ConsoleApplication" };
            var asms = AppDomain.CurrentDomain.GetAssemblies();
            var targetAssemblys = Array.FindAll(asms, (asm) =>
                assemblyStrs.Contains(asm.GetName().Name));

            // 取得したAssemblyオブジェクトのリストからバージョン文字列を生成
            string msg = "";
            Array.ForEach(targetAssemblys, (asm) =>
                msg += asm.GetName().Name + " "
                    + asm.GetName().Version.Build + " "
                    + asm.GetName().Version.Revision
                    + Environment.NewLine);

            // コンソール出力実行
            Console.WriteLine(msg);
            Console.ReadKey();
        }
    }
}


コードがごちゃっとしているので、Linqとラムダ式で少しコードを改善。(行数は増えたが、個人的には見易くなっていると思う。)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using Common;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            // Common.dllの読み込み。
            Assembly.Load(new AssemblyName("Common"));

            // バージョン出力したい .exe .dllのAssemblyオブジェクト一覧を取得し、更にAssemblyNameの一覧に変換。
            var asmNames = AppDomain.CurrentDomain.GetAssemblies().Select(asm => asm.GetName());
            var retAry = from aName in asmNames
                         where aName.Name == "Common"
                            || aName.Name == "ConsoleApplication"
                         select aName;

            // AssemblyNameオブジェクトからバージョン文字列生成するラムダ式
            Func<AssemblyName, string> getVerStr = (aName) =>
                aName.Name + " " +
                aName.Version.Build + " " + 
                aName.Version.Revision;

            // 取得したAssemblyNameオブジェクトのリストからバージョン文字列を生成し、コンソール出力実行
            retAry.Select(getVerStr).ToList().ForEach(Console.WriteLine);

            // コンソール読み込み実行
            Console.ReadKey();
        }
    }
}
・上記のコードの実行結果
 

■ちなみにアセンブリ情報で下記のようにアセンブリバージョンの3個目を*、4個目を空欄にしておくと、それらがビルド時に自動で採番される。この番号はビルドした日時と同様の値である。

0 件のコメント:

コメントを投稿