CHAPTER 15 TYPE REFLECTION, LATE BINDING, AND ATTRIBUTE-BASED PROGRAMMING
System.Reflection defines a class named Assembly. Using this class, you are able to dynamically
load an assembly, as well as discover properties about the assembly itself. Using the Assembly type, you
are able to dynamically load private or shared assemblies, as well as load an assembly located at an
arbitrary location. In essence, the Assembly class provides methods (Load() and LoadFrom(), in
particular) that allow you to programmatically supply the same sort of information found in a client-side
*.config file.
To illustrate dynamic loading, create a brand-new Console Application named
ExternalAssemblyReflector. Your task is to construct a Main() method that prompts for the friendly name
of an assembly to load dynamically. You will pass the Assembly reference into a helper method named
DisplayTypes(), which will simply print the names of each class, interface, structure, enumeration, and
delegate it contains. The code is refreshingly simple.
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
using System.Reflection;
using System.IO; // For FileNotFoundException definition.
namespace ExternalAssemblyReflector
{
class Program
{
static void DisplayTypesInAsm(Assembly asm)
{
Console.WriteLine("\n***** Types in Assembly *****");
Console.WriteLine("->{0}", asm.FullName);
Type[] types = asm.GetTypes();
foreach (Type t in types)
Console.WriteLine("Type: {0}", t);
Console.WriteLine("");
}
static void Main(string[] args)
{
Console.WriteLine("***** External Assembly Viewer *****");
string asmName = "";
Assembly asm = null;
do
{
Console.WriteLine("\nEnter an assembly to evaluate");
Console.Write("or enter Q to quit: ");
// Get name of assembly.
asmName = Console.ReadLine();
// Does user want to quit?
if (asmName.ToUpper() == "Q")
{
570