Home > Undefined > Examing an assembly through reflection

Examing an assembly through reflection

December 9th, 2009

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();
}

public 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.

Comments are closed.