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() ...(以下略)
というわけで、リファレンスマニュアルが無い閉鎖的環境でも、最小限の情報は得ることができる。