Examining an assembly through reflection
Below is code loading and examining an assembly.
Problem:
You want to open an assembly to see what’s inside with as little effort as possible.
Solution:
I’m sure there are easier ways but this works…
Code:
public static class ExamineAssembly { public static Assembly LoadAssembly(string assemblyPath) { Assembly assembly = null; if ( File.Exists(assemblyPath) ) { if ( assemblyPath != Path.GetFullPath(assemblyPath) ) assemblyPath = Path.GetFullPath(assemblyPath); assembly = Assembly.LoadFile(assemblyPath); } return assembly; } public static String GetAssemblyInfo(Assembly assembly) { if ( assembly == null ) return null; StringBuilder msg = new StringBuilder(); foreach ( Type type in assembly.GetTypes() ) { msg.AppendLine("Type: " + type.ToString()); msg.AppendLine("Name: " + type.Name); msg.AppendLine("Namespace: " + type.Namespace); msg.AppendLine(String.Empty.PadRight(72, '-')); msg.Append(GetAssemblyConstructors(type)); msg.Append(GetAssemblyDefaultMembers(type)); msg.Append(GetAssemblyEvents(type)); msg.Append(GetAssemblyFields(type)); msg.Append(GetAssemblyGenericArguments(type)); msg.Append(GetAssemblyGenericParameterConstraints(type)); msg.Append(GetAssemblyInterfaces(type)); msg.Append(GetAssemblyMembers(type)); msg.Append(GetAssemblyNestedTypes(type)); msg.Append(GetAssemblyProperties(type)); msg.AppendLine(String.Empty.PadRight(72, '-')); msg.AppendLine(Environment.NewLine); } return msg.ToString(); } public static String GetAssemblyConstructors(Type type) { StringBuilder msg = new StringBuilder(); if ( type.GetConstructors().Count() != 0 ) { msg.AppendLine("\t" + "Constructors:"); foreach ( var item in type.GetConstructors() ) { msg.AppendLine("\t\t" + "Name: " + item.Name); } } return msg.ToString(); } public static String GetAssemblyDefaultMembers(Type type) { StringBuilder msg = new StringBuilder(); if ( type.GetDefaultMembers().Count() != 0 ) { msg.AppendLine("\t" + "GetDefaultMembers:"); foreach ( var item in type.GetDefaultMembers() ) { msg.AppendLine("\t\t" + "Name: " + item.Name); } } return msg.ToString(); } public static String GetAssemblyEvents(Type type) { StringBuilder msg = new StringBuilder(); if ( type.GetEvents().Count() != 0 ) { msg.AppendLine("\t" + "GetEvents:"); foreach ( var item in type.GetEvents() ) { msg.AppendLine("\t\t" + "Name: " + item.Name); } } return msg.ToString(); } public static String GetAssemblyFields(Type type) { StringBuilder msg = new StringBuilder(); if ( type.GetFields().Count() != 0 ) { msg.AppendLine("\t" + "GetFields:"); foreach ( var item in type.GetFields() ) { msg.AppendLine("\t\t" + "Name: " + item.Name); } } return msg.ToString(); } public static String GetAssemblyGenericArguments(Type type) { StringBuilder msg = new StringBuilder(); if ( type.GetGenericArguments().Count() != 0 ) { msg.AppendLine("\t" + "GetGenericArguments:"); foreach ( var item in type.GetGenericArguments() ) { msg.AppendLine("\t\t" + "Name: " + item.Name); } } return msg.ToString(); } public static String GetAssemblyGenericParameterConstraints(Type type { StringBuilder msg = new StringBuilder(); if ( type.IsGenericParameter ) { msg.AppendLine("\t" + "GetGenericParameterConstraints:"); foreach ( var item in type.GetGenericParameterConstraints() ) { msg.AppendLine("\t\t" + "Name: " + item.Name); } } return msg.ToString(); } ublic static String GetAssemblyInterfaces(Type type) { StringBuilder msg = new StringBuilder(); if ( type.GetInterfaces().Count() != 0 ) { msg.AppendLine("\t" + "GetInterfaces:"); foreach ( var item in type.GetInterfaces() ) { msg.AppendLine("\t\t" + "Name: " + item.Name); } } return msg.ToString(); } public static String GetAssemblyMembers(Type type) { StringBuilder msg = new StringBuilder(); if ( type.GetMembers().Count() != 0 ) { msg.AppendLine("\t" + "GetMembers:"); foreach ( var item in type.GetMembers() ) { msg.AppendLine("\t\t" + "Name: " + item.Name); } } return msg.ToString(); } public static String GetAssemblyNestedTypes(Type type) { StringBuilder msg = new StringBuilder(); if ( type.GetNestedTypes().Count() != 0 ) { msg.AppendLine("\t" + "GetNestedTypes:"); foreach ( var item in type.GetNestedTypes() ) { msg.AppendLine("\t\t" + "Name: " + item.Name); } } return msg.ToString(); } public static String GetAssemblyProperties(Type type) { StringBuilder msg = new StringBuilder(); if ( type.GetProperties().Count() != 0 ) { msg.AppendLine("\t" + "GetProperties:"); foreach ( var item in type.GetProperties() ) { msg.AppendLine("\t\t" + "Name: " + item.Name); } } return msg.ToString(); } }
Usage:
Assembly assembly = ExamineAssembly.LoadAssembly("AddInScanEngine.dll");
String msg = ExamineAssembly.GetAssemblyInfo(assembly);
tbxResults.Text += msg; // textbox on UI.
Notes:
This class doesn’t have any try/catch blocks. You might want them. I didn’t need it because of how I am using the class for ‘research’ and not ‘production.’
I did the minimum for returning the contents of the assembly. If you want more info, dig into the specific method and extend as needed.
