Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Console.WriteLine("-> Calling SayHello via late binding.");

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

mi.Invoke(obj, null);

// Вызвать метод GetMsg.

mi = hello.GetMethod("GetMsg");

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

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

языка CIL, а также способа обработки кода компилятором C# в процессе его компиляции.

Резюме

В главе был представлен обзор синтаксиса и семантики языка CIL. В отличие от управляемых языков более высокого уровня, таких как С#, в CIL не просто определяется набор ключевых слов, а предоставляются директивы (используемые для определения конструкции сборки и ее типов), атрибуты (дополнительно уточняющие данные директивы) и коды операций (применяемые для реализации членов типов).

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

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

System.Reflection.Emit
, сборку .NET Core можно определять в памяти во время выполнения. Вы видели, что работа с этим пространством имен требует знания семантики кода CIL. Хотя построение динамических сборок не является распространенной задачей при разработке большинства приложений .NET Core, оно может быть полезно в случае создания инструментов поддержки и различных утилит для программирования.

Часть VI

Работа с файлами, сериализация объектов и доступ к данным

Глава 20

Файловый ввод-вывод и сериализация объектов

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

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

После изучения способов манипулирования файлами и каталогами с использованием основных типов ввода-вывода вы ознакомитесь со связанной темой — сериализацией объектов. Сериализацию объектов можно применять для сохранения и извлечения состояния объекта с помощью любого типа, производного от

System.IO.Stream
.

На заметку! Чтобы можно было успешно выполнять примеры в главе, IDE-среда Visual Studio должна быть запущена с правами администратора (для этого нужно просто щелкнуть правой кнопкой мыши на значке Visual Studio и выбрать в контекстном меню пункт Запуск от имени администратора). В противном случае при доступе к файловой системе компьютера могут возникать исключения, связанные с безопасностью.

Исследование пространства имен System.IO

В рамках платформы .NET Core пространство имен

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

Многие типы из пространства имен

System.IO
сосредоточены на программной манипуляции физическими каталогами и файлами. Тем не менее, дополнительные типы предоставляют поддержку чтения и записи данных в строковые буферы, а также в области памяти. В табл. 20.1 кратко описаны основные (неабстрактные) классы, которые дают понятие о функциональности, доступной в пространстве имен
System.IO
.

В дополнение к описанным конкретным классам внутри

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

Классы Directory(Directorylnfо) и File(FileInfo)

Пространство имен

System.IO
предлагает четыре класса, которые позволяют манипулировать индивидуальными файлами, а также взаимодействовать со структурой каталогов машины. Первые два класса,
Directory
и
File
, открывают доступ к операциям создания, удаления, копирования и перемещения через разнообразные статические члены. Тесно связанные с ними классы
FileInfo
и
DirectoryInfo
обеспечивают похожую функциональность в виде методов уровня экземпляра (следовательно, их экземпляры придется создавать с помощью ключевого слова
new
). Классы
Directory
и
File
непосредственно расширяют класс
System.Object
, в то время как
DirectoryInfo
и
FileInfo
являются производными от абстрактного класса
FileSystemInfo
.

Обычно классы

FileInfo
и
DirectoryInfo
считаются лучшим выбором для получения полных сведений о файле или каталоге (например, времени создания или возможности чтения/записи), т.к. их члены возвращают строго типизированные объекты. В отличие от них члены классов
Directory
и
File
, как правило, возвращают простые строковые значения, а не строго типизированные объекты. Тем не менее, это всего лишь рекомендация; во многих случаях одну и ту же работу можно делать с использованием
File/FileInfo
или
Directory/DirectoryInfo
.

Абстрактный базовый класс FileSystemInfo

Классы

DirectoryInfo
и
FileInfo
получают многие линии поведения от абстрактного базового класса
FileSystemInfo
. По большей части члены класса
FileSystemInfo
применяются для выяснения общих характеристик (таких как время создания, разнообразные атрибуты и т.д.) заданного файла или каталога. В табл. 20.2 перечислены некоторые основные свойства, представляющие интерес.

В классе

FileSystemInfо
также определен метод
Delete
. Он реализуется производными типами для удаления заданного файла или каталога с жесткого диска. Кроме того, перед получением информации об атрибутах можно вызвать метод
Refresh
, чтобы обеспечить актуальность статистических данных о текущем файле или каталоге.

Работа с типом DirectoryInfо

Поделиться с друзьями: