Рейтинговые книги
Читем онлайн ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 136 137 138 139 140 141 142 143 144 ... 259

Чтобы сделать процесс немного более интересным, после завершения вызова CreateMyAsm() будет выполнено динамическое связывание (см. главу 12), обеспечивающее загрузку нового компоновочного блока в память и взаимодействие с членами класса HelloWorld.

using System;

using System.Reflection.Emit;

using System.Reflection;

using System.Threading;

public class Program {

 static void Main(string[] args) {

  Console.WriteLine("********* Чудесный построитель **********");

  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.

Несколько слов о System.CodeDOM

Теперь, когда мы с вами выяснили, как создаются динамические компоновочные блоки с помощью 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.

Резюме

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

Вторая половина главы была посвящена обсуждению пространства имен System.Reflection.Emit. Используя соответствующие типы, вы можете создавать компоновочные блоки .NET в памяти динамически. При желании можно также сохранить созданный в памяти образ в физическом файле на диске. Многие типы System.Reflection.Emit автоматически генерируют подходящие директивы и атрибуты CIL, используя другие связанные с ними типы, такие как ConstructorBuilder, TypeBuilder и т.д. Тип ILGenerator может использоваться для добавления необходимых кодов операций CIL в члены типа. И хотя существует целый ряд вспомогательных типов, призванных упростить процесс создания программ при использовании кодов операций CIL, для успешного создания динамических компоновочных блоков вам понадобится хорошее понимание языка CIL.

ЧАСТЬ IV. Программирование с помощью библиотек .NET

ГЛАВА 16. Пространство имен System.IO

При создании полноценных приложений исключительно важна возможность сохранения информации между сеансами доступа пользователя. В этой главе рассматривается целый ряд вопросов, связанных с реализацией ввода-вывода в .NET. Первой нашей задачей будет исследование базовых типов, определенных в пространстве имен System.IO, и выяснение того, как программными средствами можно изменить рабочий каталог и структуру файлов машины. После этого мы рассмотрим различные возможности чтения и записи данных из файлов с сим-вольной, двоичной и строковой организацией, а также из памяти.

Анализ пространства имен System.IO

В .NET пространство имен System.IO является той частью библиотек базовых адресов, которая обслуживает службы ввода-вывода, как для файлов, так и для памяти. Подобно любому другому пространству имен, System.IO определяет свой набор классов, интерфейсов, перечней, структур и делегатов, большинство из которых содержится в mscorlib.dll. Вдобавок к типам, содержащимся в mscorlib.dll, часть членов System.IO содержится в компоновочном блоке System.dll (все проекты в Visual Studio 2005 автоматически устанавливают ссылку на оба эти компоновочных блока, поэтому вам об этом беспокоиться не приходится).

Задачей многих типов, принадлежащих System.IO), является программная поддержка физических операций с каталогами и файлами. Но есть и другие типы, обеспечивающие поддержку операций чтения и записи данных строковых буферов, a также непосредственный доступ к памяти. Чтобы представить вам общую картину функциональных возможностей пространства имен System.IO, в табл. 16.1 описаны его базовые (неабстрактные) классы.

Вдобавок к этим типам, допускающим создание экземпляров, в System.IO определяется целый ряд перечней, а также набор абстрактных классов (Stream, TextReader, TextWriter и т.д.), которые обеспечивают открытый полиморфный интерфейс всем своим производным классам. Более подробная информация об этих типах будет предлагаться в процессе дальнейшего обсуждения материала этой главы.

Таблица 16.1. Ключевые типы пространства имен System.IO

Неабстрактный тип класса ввода-вывода Описание BinaryReader BinaryWriter Позволяют сохранять и читать примитивные типы данных (целые, логические, строковые и другие), как двоичные значения BufferedStream Обеспечивает временное хранилище для потока байтов, которые можно будет направить в другое хранилище позже Directory DirectoryInfо Используются для работы со структурой каталогов машины. Тип Directory предлагает свои функциональные возможности, в основном через статические методы. Тип DirectoryInfo обеспечивает аналогичные возможности с помощью подходящей объектной переменной DriveInfo Этот тип (появившийся в .NET 2.0) предлагает подробную информацию о дисках, установленных на машине File FileInfo Используются для работы с файлами. Тип File предлагает свои функциональные возможности, в основном через статические методы. Тип FileInfo обеспечивает аналогичные возможности с помощью подходящей объектной переменной FileStream Позволяет реализовать произвольный доступ к файлам (например, поиск), когда данные представлены в виде потока байтов FileSystemWatcher Позволяет контролировать изменения внешнего файла MemoryStream Обеспечивает прямой доступ к данным, сохраненным в памяти, а не в физическом файле Path Выполняет операции с типами System.String, содержащими информацию о файлах или каталогах в независимом от платформы виде StreamWriter StreamReader Используются для записи (и чтения) текстовой информации файлов. Эти типы не поддерживают доступ к файлам с произвольной организацией StringWriter StringReader Подобно типам StreamReader/StreamWriter, эти классы тоже обеспечивают обработку текстовой информации. Однако соответствующим хранилищем в данном случае является строковый буфер, а не физический файл

Типы Directory(Info) и File(Info)

1 ... 136 137 138 139 140 141 142 143 144 ... 259
На этой странице вы можете бесплатно читать книгу ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен бесплатно.
Похожие на ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - Эндрю Троелсен книги

Оставить комментарий