Console.WriteLine ("*** динамических компоновочных блоков ***");

  // Получение домена приложения для данного потока.

  AppDomain currAppDomain = Thread.GetDomain;

  // Создание динамического компоновочного блока с помощью f(х).

  СreateMyAsm(currAppDomain);

  Console.WriteLine("-› Завершение создания MyAssembly.dll.");

  // Теперь загрузка нового компоновочного блока из файла.

  Console.WriteLine("-› Загрузка MyAssembly.dll из файла.");

  Assembly a = Assembly.Load("MyAssembly");

  // Получение типа HellоWorld.

  Type hello = a.GetType("MyAssembly.HelloWorld");

  // Создание объекта HelloWorld и вызов нужного конструктора.

  Console.Write("-› Введите сообщение для класса HelloWorld: ");

  string msg = Console.ReadLine;

  object[] ctorArgs = new object[1];

  ctorArgs[0] = msg;

  object obj = Activator.CreateInstance(hello, ctorArgs);

  // Вызов SayHello и вывод возвращенной строки.

  Console.WriteLine("-› Вызов SayHello");

  Console.WriteLine(" через динамическое связывание.");

  MethodInfo mi = hello.GetMethod("SayHello");

  mi.Invoke(obj, null);

  // Подключение GetMsg. Метод Invoke возвращает объект,

  // содержащий возвращенное значение метода.

  mi = hello.GetMethod("GetMsg");

  Console.WriteLine(mi.Invoke(obj, null));

 }

}

В результате создается компоновочный блок .NET, способный создавать компоновочные блоки .NET в среде выполнения.

На этом наш обзор CIL и роли динамических компоновочных блоков завершается. Я надеюсь, эта глава позволила расширить горизонты вашего понимания системы типов .NET, а также синтаксиса и семантики CIL.

Замечание. Обязательно загрузите свой динамически созданный компоновочный блок в ildasm.exe, чтобы выяснить, как функциональные возможности пространства имен System. Reflection.Emit реализуются в программном коде CIL

Исходный код. Проект DynAsmBuilder размещен в подкаталоге, соответствующем главе 15.

<p>Несколько слов о System.CodeDOM</p>

Теперь, когда мы с вами выяснили, как создаются динамические компоновочные блоки с помощью System.Reflection.Emit и различных лексем CIL, я должен сообщить вам, что есть и другая (часто более простая) альтернатива. Платформа .NET предлагает технологию под названием модель DOM для программного кода (модель code DOM), которая позволяет представить структуру .NET-типа в независимых от языка терминах с помощью объектного графа. Построив такой граф с помощью членов пространства имен System.CodeDOM, вы получаете возможность динамически перевести его содержимое в файл программного кода, соответствующего любому языку (C#, Visual Basic .NET или любому языку стороннего поставщика, обеспечившего поддержку code DOM). Кроме того, пространство имен System.CodeDOM.Compiler и связанные с ним другие пространства имен могут использоваться для компиляции объектного графа, находящегося в памяти (или сохраненного) объекта в действительный статический компоновочный блок .NET.

К сожалению, в этой книге нет места для подробного обсуждения технологии code DOM. Поэтому если вам нужна дополнительная информация, выполните поиск по ключу "CodeDOM, quick reference" в документации .NET Framework 2.0 SDK.

<p>Резюме</p>

В этой главе предлагается краткий обзор возможностей синтаксиса и семантики CIL. В отличие от управляемых языков высшего уровня, таких как, например, C#, в CIL не просто определяется набор ключевых слов, но и директивы (для определения структуры компоновочного блока и его типов), атрибуты (уточняющие характеристики соответствующей директивы) и коды операций (используемые для реализации членов типов). Был также рассмотрен компилятор CIL (ilasm.exe). Вы узнали о том, как изменить содержимое компоновочного блока .NET, непосредственно изменяя его программный код CIL, и рассмотрели основные этапы, процесса построения компоновочного блока .NET с помощью CIL.

Перейти на страницу:

Похожие книги