// -------------------------------------------------------
// 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
, которые необходимо знать.
Чтобы понять, каким образом задействовать пространство имен
System.Reflection
для программного чтения метаданных .NET Core, сначала следует ознакомиться с классом
System.Туре
.
Класс System.Туре
В классе
System.Туре
определены члены, которые могут применяться для исследования метаданных типа, большое количество которых возвращают типы из пространства имен
System.Reflection
. Например, метод
Туре.GetMethods()
возвращает массив объектов
MethodInfo
, метод
Type.GetFields()
— массив объектов
FieldInfo
и т.д. Полный перечень членов, доступных в
System.Туре
, довольно велик, но в табл. 17.2 приведен список избранных членов, поддерживаемых
System.Туре
(за исчерпывающими сведениями обращайтесь в документацию по .NET Core).
Получение информации о типе с помощью System.Object.GetType()
Экземпляр класса
Туре
можно получать разнообразными способами. Тем не менее, есть одна вещь, которую делать невозможно — создавать объект
Туре
напрямую, используя ключевое слово
new
, т.к.
Туре
является абстрактным классом. Касательно первого способа вспомните, что в классе
System.Object
определен метод
GetType()
, который возвращает экземпляр класса
Туре
, представляющий метаданные текущего объекта: