Литмир - Электронная Библиотека
A
A

// -------------------------------------------------------

//   Token: 0x20000001

//   Name : CarLibrary

//   Public Key    :

//   Hash Algorithm : 0x00008004

//   Version: 1.0.0.1

//   Major Version: 0x00000001

//   Minor Version: 0x00000000

//   Build Number: 0x00000000

//   Revision Number: 0x00000001

//   Locale: <null>

//   Flags : [none] (00000000)

Документирование ссылаемых сборок

В дополнение к маркеру

Assembly
и набору блоков
TypeDef
и
TypeRef
в метаданных .NET Core также применяются маркеры
AssemblyRef #n
для документирования каждой внешней сборки. С учетом того, что каждая сборка .NET Core ссылается на библиотеку базовых классов
System.Runtime
, вы обнаружите
AssemblyRef
для сборки
System.Runtime
, как показано в следующем фрагменте:

// AssemblyRef #1 (23000001)

// -------------------------------------------------------

//   Token: 0x23000001

//   Public Key or Token: b0 3f 5f 7f 11 d5 0a 3a

//   Name: System.Runtime

//   Version: 5.0.0.0

//   Major Version: 0x00000005

//   Minor Version: 0x00000000

//   Build Number: 0x00000000

//   Revision Number: 0x00000000

//   Locale: <null>

//   HashValue Blob:

//   Flags: [none] (00000000)

Документирование строковых литералов

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

User Strings
:

// User Strings

// -------------------------------------------------------

// 70000001 : (23) L"CarLibrary Version 2.0!"

// 70000031 : (13) L"Quiet time..."

// 7000004d : (11) L"Jamming {0}"

// 70000065 : (32) L"Eek! Your engine block exploded!"

// 700000a7 : (34) L"Ramming speed! Faster is better..."

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

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

На заметку! В разделе

METAINFO
вы также найдете несколько маркеров
CustomAttribute
, которые документируют атрибуты, применяемые внутри кодовой базы. Роль атрибутов .NET Core обсуждается позже в главе.

Понятие рефлексии

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

ildasm.exe
, используя дружественную объектную модель. Например, посредством рефлексии можно извлечь список всех типов, содержащихся внутри заданной сборки
*.dll
или
*.ехе
, в том числе методы, поля, свойства и события, которые определены конкретным типом. Можно также динамически получать набор интерфейсов, поддерживаемых заданным типом, параметры метода и другие относящиеся к ним детали (базовые классы, пространства имен, данные манифеста и т.д.).

Как и любое другое пространство имен,

System.Reflection
(из сборки
System.Runtime.dll
) содержит набор связанных типов. В табл. 17.1 описаны основные члены
System.Reflection
, которые необходимо знать.

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

Чтобы понять, каким образом задействовать пространство имен

System.Reflection
для программного чтения метаданных .NET Core, сначала следует ознакомиться с классом
System.Туре
.

Класс System.Туре

В классе

System.Туре
определены члены, которые могут применяться для исследования метаданных типа, большое количество которых возвращают типы из пространства имен
System.Reflection
. Например, метод
Туре.GetMethods()
возвращает массив объектов
MethodInfo
, метод
Type.GetFields()
— массив объектов
FieldInfo
и т.д. Полный перечень членов, доступных в
System.Туре
, довольно велик, но в табл. 17.2 приведен список избранных членов, поддерживаемых
System.Туре
(за исчерпывающими сведениями обращайтесь в документацию по .NET Core).

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

Получение информации о типе с помощью System.Object.GetType()

Экземпляр класса

Туре
можно получать разнообразными способами. Тем не менее, есть одна вещь, которую делать невозможно — создавать объект
Туре
напрямую, используя ключевое слово
new
, т.к.
Туре
является абстрактным классом. Касательно первого способа вспомните, что в классе
System.Object
определен метод
GetType()
, который возвращает экземпляр класса
Туре
, представляющий метаданные текущего объекта:

319
{"b":"847442","o":1}