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
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.
Несколько слов о System.CodeDOM
Теперь, когда мы с вами выяснили, как создаются динамические компоновочные блоки с помощью System.Reflection.Emit и различных лексем CIL, я должен сообщить вам, что есть и другая (часто более простая) альтернатива. Платформа .NET предлагает технологию под названием
К сожалению, в этой книге нет места для подробного обсуждения технологии
Резюме
В этой главе предлагается краткий обзор возможностей синтаксиса и семантики CIL. В отличие от управляемых языков высшего уровня, таких как, например, C#, в CIL не просто определяется набор ключевых слов, но и директивы (для определения структуры компоновочного блока и его типов), атрибуты (уточняющие характеристики соответствующей директивы) и коды операций (используемые для реализации членов типов). Был также рассмотрен компилятор CIL (ilasm.exe). Вы узнали о том, как изменить содержимое компоновочного блока .NET, непосредственно изменяя его программный код CIL, и рассмотрели основные этапы, процесса построения компоновочного блока .NET с помощью CIL.