Язык программирования C#9 и платформа .NET5
// -------------------------------------------------------// 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в метаданных .NET Core также применяются маркерыTypeRefдля документирования каждой внешней сборки. С учетом того, что каждая сборка .NET Core ссылается на библиотеку базовых классовAssemblyRef #n, вы обнаружите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, которые документируют атрибуты, применяемые внутри кодовой базы. Роль атрибутов .NET Core обсуждается позже в главе.CustomAttributeПонятие рефлексии
В мире .NET Core рефлексией называется процесс обнаружения типов во время выполнения. Службы рефлексии дают возможность получать программно ту же самую информацию о метаданных, которую генерирует утилита
, используя дружественную объектную модель. Например, посредством рефлексии можно извлечь список всех типов, содержащихся внутри заданной сборкиildasm.exeили*.dll, в том числе методы, поля, свойства и события, которые определены конкретным типом. Можно также динамически получать набор интерфейсов, поддерживаемых заданным типом, параметры метода и другие относящиеся к ним детали (базовые классы, пространства имен, данные манифеста и т.д.).*.ехеКак и любое другое пространство имен,
(из сборкиSystem.Reflection) содержит набор связанных типов. В табл. 17.1 описаны основные членыSystem.Runtime.dll, которые необходимо знать.System.ReflectionЧтобы понять, каким образом задействовать пространство имен
для программного чтения метаданных .NET Core, сначала следует ознакомиться с классомSystem.Reflection.System.ТуреКласс System.Туре
В классе
определены члены, которые могут применяться для исследования метаданных типа, большое количество которых возвращают типы из пространства именSystem.Туре. Например, методSystem.Reflectionвозвращает массив объектовТуре.GetMethods(), методMethodInfo— массив объектовType.GetFields()и т.д. Полный перечень членов, доступных вFieldInfo, довольно велик, но в табл. 17.2 приведен список избранных членов, поддерживаемыхSystem.Туре(за исчерпывающими сведениями обращайтесь в документацию по .NET Core).System.ТуреПолучение информации о типе с помощью System.Object.GetType()
Экземпляр класса
можно получать разнообразными способами. Тем не менее, есть одна вещь, которую делать невозможно — создавать объектТуренапрямую, используя ключевое словоТуре, т.к.newявляется абстрактным классом. Касательно первого способа вспомните, что в классеТуреопределен методSystem.Object, который возвращает экземпляр классаGetType(), представляющий метаданные текущего объекта:Туре

