Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 315 316 317 318 319 320 321 322 323 ... 642

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

//   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..."

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

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

У вас может возникнуть вопрос о том, каким образом задействовать такую информацию в разрабатываемых приложениях (в лучшем сценарии) или зачем вообще заботиться о метаданных (в худшем сценарии). Чтобы получить ответ, необходимо ознакомиться со службами рефлексии .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(), который возвращает экземпляр класса Туре, представляющий метаданные текущего объекта:

1 ... 315 316 317 318 319 320 321 322 323 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

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