ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

dllに含まれるクラスの一覧を取得する

プログラミングC# p461辺り。
リフレクション的な話。

Javaであればjarファイルにクラスがまとまっているわけですが、クラスの一覧を取得するだけなら、jarファイルの中身を展開すれば済みます。(jar tvf rt.jarとかね)
C#ではdllにクラスその他もろもろまとまっているわけで、こいつは圧縮ファイルでない(ある意味そうかも知れないが)ので、中身を見る手段が必要になります。
その手段っていうのが、リフレクションだったりします。
そこで、こんなプログラムを書いてみる。

using System;
using System.Reflection;

class Classes
{
        static void Main(string[] args)
        {
                Assembly asm = Assembly.LoadFile(args[0]);
                Type[] types = asm.GetTypes();
                foreach(Type t in types)
                {
                        Console.WriteLine(t);
                }
        }
}

で、こいつを、こんな風に起動してみる。

>Classes C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll

すると、こんな結果が得られる。

System.Object
FXAssembly
ThisAssembly
AssemblyRef
System.__Canon
System.ICloneable
System.Collections.IEnumerable
System.Collections.ICollection
System.Collections.IList
System.Array
System.Collections.Generic.IComparer`1[T]
System.Array+FunctorComparer`1[T]
System.ValueType
System.Array+SorterObjectArray
System.Array+SorterGenericArray
System.Collections.IEnumerator
System.Array+SZArrayEnumerator
System.Array+ArrayEnumerator
System.SZArrayHelper
System.IDisposable
System.Collections.Generic.IEnumerator`1[T]
System.SZArrayHelper+SZGenericArrayEnumerator`1[T]
System.ArraySegment`1[T]
System.IComparable
...(以下略)

で、ここまで出来ると、今度はjavap相当の機能が欲しくなってくる。
とりあえず、メソッド一覧を取得してみる。

using System;
using System.Reflection;

class Methods
{
        static void Main(string[] args)
        {
                string typeName = args[0];
                Type t = Type.GetType(typeName);
                MethodInfo[] methods = t.GetMethods();
                foreach(MethodInfo m in methods)
                {
                        Console.WriteLine(m);
                }
        }
}

で、こいつを、こんな風に起動してみる。

>Methods System.Reflect.Assembly

すると、こんな結果が得られる。

System.String CreateQualifiedName(System.String, System.String)
System.Security.Policy.Evidence get_Evidence()
System.String get_Location()
Boolean Equals(System.Object)
Int32 GetHashCode()
Void add_ModuleResolve(System.Reflection.ModuleResolveEventHandler)
Void remove_ModuleResolve(System.Reflection.ModuleResolveEventHandler)
System.String get_CodeBase()
System.String get_EscapedCodeBase()
System.Reflection.AssemblyName GetName()
...(以下略)

というわけで、リファレンスマニュアルが無い閉鎖的環境でも、最小限の情報は得ることができる。