Home > Technology > Examining an assembly through reflection

Examining an assembly through reflection

December 9th, 2009 Leave a comment Go to comments

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.

  1. No comments yet.
  1. No trackbacks yet.
You must be logged in to post a comment.