Хотя большинство приложений в этой книге состоят из одного модуля, вы можете создавать сборки, состоящие из нескольких модулей. Получать имена модулей из объекта
Assembly
можно двумя способами. Первый — это запрос массива всех модулей. При этом осуществляется проход по всем модулям и вывод любых нужных данных. Второй способ — получение информации о конкретном модуле.
Чтобы проиллюстрировать циклический опрос модулей, нужно создать сборку, состоящую из более чем одного модуля. Я сделаю это путем перевода
Get Assembly Name
в собственный класс и размещения этого класса в отдельном файле с именем
Assembly Utils.netmodule,
например, так: using System.Diagnostics;
namespace MyUtilities {
public class AssemblyUtils {
public static string GetAssembiyName(string[] args) {
string assemblyName;
if (0 == args.Length) <
Process p = Process.GetCurrentProcessQ;
assemblyName = p.ProcessName + ".exe"; } else
assemblyName = args[0];
ч
return assemblyName; } } }
После этого создаем модуль netmodule командой: esc /target:module AssemblyUtils.es
Переключатель
/target-.module
затавляет компилятор генерировать модуль, который позже будет включен в сборку. Приведенная команда создаст файл AssemblyUtils.netmodule. Подробнее о создании сборок и модулей см. главу 18.
А сейчас я хочу создать вспомогательный модуль, чтобы у нас был предмет для отражения. Приведенное ниже приложение будет использовать класс
AssemblyUtils.
Обратите внимание на оператор
using,
в котором указано пространство имен
My Utilities.
using System;
using System.Reflection;
using MyUtilities;
class GetModulesApp {
public static void Hain(string[] args)
{
string assemblyNarae = AssemblyUtils.GetAssemblyName(args);
Console.WriteLine("Loading info for " + assemblyName); Assembly a = Assembly.LoadFrom(assemblyName);
Module[] modules = a.GetModulesO; foreach(Module m in modules) <
Console.WriteLine("Module: " + m.Name); } } }
Чтобы скомпилировать это приложение и добавить к сборке модуль AssemblyUtils.netmodule, нужно задействовать переключатели командной строки:
esc /addmodule:AssemblyUtils.netmodule GetModules.es
Теперь у нас есть сборка из двух модулей. Чтобы увидеть это, запустите приложение. При этом получатся такие результаты:
Loading info for GetModulesApp.exe
Module: GetModulesApp.exe
Module: AssemblyUtils.netmodule
Как стало ясно из кода, я просто создал экземпляр объекта
Assembly
и вызвал его метод
GetModules.
Затем я циклически обработал возвращенный массив и вывел имя каждого из них.