Поиск

Вывод списка модулей сборки

Хотя большинство приложений в этой книге состоят из одного модуля, вы можете создавать сборки, состоящие из нескольких модулей. Получать имена модулей из объекта 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. Затем я циклически обработал возвращенный массив и вывел имя каждого из них.