To iterate through an assembly's modules, I need to create an assembly with more than one module. I'll do that by moving GetAssemblyName into its own class and putting that class into a file called AssemblyUtils.netmodule, like so: -
using System.Diagnostics; namespace MyUtilities { public class AssemblyUtils { public static string GetAssemblyName(string[] args) { string assemblyName; if (0 == args.Length) { Process p = Process.GetCurrentProcess(); assemblyName = p.ProcessName + ".exe"; } else assemblyName = args[0]; return assemblyName; } } }
The netmodule is then built using the following command: -
csc /target:module AssemblyUtils.cs
The /target:module switch causes the compiler to generate a module for later inclusion in an assembly. The command above will create a file named AssemblyUtils.netmodule. In Chapter 18, I'll cover the different options when creating assemblies and modules in a bit more detail.
At this point, I just want to create a secondary module so that we have something to reflect upon. The application that will use the AssemblyUtils class follows. Note the using statement where the MyUtilities namespace is referenced.
using System; using System.Reflection; using MyUtilities; class GetModulesApp { public static void Main(string[] args) { string assemblyName = AssemblyUtils.GetAssemblyName(args); Console.WriteLine("Loading info for " + assemblyName); Assembly a = Assembly.LoadFrom(assemblyName); Module[] modules = a.GetModules(); foreach(Module m in modules) { Console.WriteLine("Module: " + m.Name); } } }
To compile this application and have the AssemblyUtils.netmodule added to its assembly, you'll need to use the following command-line switches: -
csc /addmodule:AssemblyUtils.netmodule GetModules.cs
At this point, you have an assembly with two different modules. To see this, execute the application-the results should be as follows: -
Loading info for GetModulesApp.exe Module: GetModulesApp.exe Module: AssemblyUtils.netmodule
As you can see from the code, I simply instantiated an Assembly object and called its GetModules method. From there I iterated through the returned array and printed the name of each one.