(以下のようなプロジェクト構成)
このプロジェクト構成で、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 件のコメント:
コメントを投稿