アセンブリからグローバル属性を取得する

スカゼミ内で、アセンブリから著作権情報を抜き出す方法についての質問があったので、調べてみました

 

グローバル属性とは、クラスやメソッドなどの要素に結び付けられていない、アセンブリ全体に適用される属性のことです。

例えば、AssemblyInfo.cs にデフォルトで書かれている、下のような属性はバージョン情報をアセンブリに埋め込みたいときに使用できます。

[assembly: AssemblyVersion("1.0.0.0")]

このような属性は他にもあります。詳しくはMSDNを参照してください。

 

グローバル属性はアセンブリ情報を埋め込むために使用されることも多く、著作権情報やバージョン情報、タイトルなどのアセンブリ情報はソースコードで取得して使用したいこともしばしばあります。

そのようなときは、System.Reflection.Assembly.GetCustomAttributes メソッドを使用することで取得することができます。

以下にいくつかのグローバル属性を取得し、表示するサンプルを示します。

using System;

using System.Reflection;

using System.Linq;

[assembly: AssemblyTitle("GetAssemblyAttributes")]

[assembly: AssemblyDescription("アセンブリ情報を取得するテスト")]

[assembly: AssemblyCopyright("Copyright (C) 2014 YuZakuro")]

class Program

{

public static void Main()

{

var title = GetAssemblyAttributes<AssemblyTitleAttribute>(Assembly.GetExecutingAssembly());

var description = GetAssemblyAttributes<AssemblyDescriptionAttribute>(Assembly.GetExecutingAssembly());

var copy = GetAssemblyAttributes<AssemblyCopyrightAttribute>(Assembly.GetExecutingAssembly());

Console.WriteLine("Title: {0}", title.Title);

Console.WriteLine("Description: {0}",description.Description);

Console.WriteLine("Copyright: {0}", copy.Copyright);

}

static T GetAssemblyAttributes<T>(Assembly target)

where T : class

{

var attributes = target.GetCustomAttributes(typeof(T), false);

if (attributes != null && attributes.Any())

return attributes[0] as T;

return null;

}

}

Assembly.GetExecutingAssembly()の部分を変えることで、任意のアセンブリの情報を取得できます。

注意点としては、ジェネリクスではないので typeof で型を渡し、返り値は Object[] なので、適当にキャストしなければいけません。

ジェネリクスがない時代のメソッドなので、やや美しくないのは仕方ないところです。ともあれ、これでアセンブリ情報を取得することが出来ました。