Читайте также:
|
|
Мы будем называть метаинструментами программы, для которых другие программы выступают в роли данных. Метаинструменты используются для разработки, тестирования, анализа и преобразования программ. Это могут быть компиляторы, средства быстрой разработки приложений (RAD), оптимизаторы, отладчики. Метаинструменты для платформы.NET – это программы, рассматривающие сборки.NET в качестве объектов анализа, генерации или преобразования[12].
Сборка.NET представляет собой совокупность метаданных, CIL-кода и, возможно, ресурсов. Поэтому библиотеки, необходимые для создания метаинструментов, должны обеспечивать чтение и генерацию этой информации. В составе.NET Framework SDK поставляются две библиотеки, частично решающие эти задачи. Это Metadata Unmanaged API и библиотека рефлексии (Reflection API). Кроме того, существуют созданные сторонними разработчиками библиотеки AbstractIL и Mono.Cecil. AbstractIL. В данном разделе проведем обзор этих библиотек.
Metadata Unmanaged API осуществляет импорт и генерацию метаданных. Оно предназначено, главным образом, для использования в компиляторах и загрузчиках, которым требуется высокая скорость доступа к метаданным и работа с метаданными на низком уровне.
При использовании Metadata Unmanaged API метаинструмент работает с образом сборки в памяти (в документации такой образ называется scope). Метаинструмент может создать образ новой сборки или загрузить существующую сборку из файла, а кроме того, может сохранить образ сборки в файл. Навигация через иерархию метаданных осуществляется на достаточно низком уровне с использованием токенов метаданных (токен некоторого элемента метаданных – это тридцати двух разрядное число, старший байт которого обозначает таблицу, в которой хранятся элементы метаданных соответствующего типа, а остальные три байта являются индексом элемента в этой таблице). Metadata Unmanaged API предоставляет прямой доступ к таблицам метаданных, позволяет сливать несколько сборок в одну, но не содержит явных средств для работы с CIL-кодом [2].
Кроме того, метаинструмент, использующий это API, должен быть написан на C++.
Reflection API - библиотека рефлексии – процессов обнаружения типов во время выполнения программы. С применением служб рефлексии те же самые метаданные, которые отображает утилита ildasm.exe, можно получать программно в виде удобной объектной модели [10]. Эта библиотека содержит классы для работы с метаданными на высоком уровне. Она соответствует спецификации CLS, поэтому использующий ее метаинструмент может быть написан на любом языке платформы.NET, который является потребителем CLS-библиотек.
Библиотека рефлексии спроектирована таким образом, что создание объектов рефлексии, соответствующих элементам метаданных, осуществляется путем вызова методов других объектов [13].
Другими словами, конструкторы классов, входящих в библиотеку, для пользователя библиотеки недоступны. Информацию о любом элементе метаданных можно прочитать из свойств соответствующего ему объекта рефлексии.
Кроме чтения метаданных, библиотека рефлексии позволяет создавать экземпляры типов, входящих в обрабатываемую сборку, вызывать методы этих типов, читать и изменять значения полей. Для генерации метаданных в библиотеке рефлексии предназначены классы пространства имен System.Reflection.Emit.
В отличие от Metadata Unmanaged API, библиотека рефлексии содержит средства для генерации CIL-кода. Для этого предназначен класс ILGenerator. Он позволяет после создания объекта MethodBuilder (или ConstructorBuilder) сгенерировать для соответствующего метода (или конструктора) поток инструкций.
Однако библиотеки, необходимые для создания метаинструментов, должны обеспечивать чтение и генерацию этой информации. На сегодняшний день существует несколько библиотек предоставляющих подобную функциональность, например, AbstractIL и Mono.Cecil. AbstractIL – библиотека реализованная Microsoft Research, предоставляет богатые возможности по манипулированию CIL кодом. Одним из недостатков данной библиотеки является то, что она реализована на F# – функциональном языке программирования. Использование такой библиотеки из императивных языков программирования затруднено. Mono.Cecil – библиотека с открытым исходным кодом, реализованная в рамках проекта Mono. В отличие от AbstractIL, она обладает простотой и удобством, а открытость исходного кода позволяет модифицировать ее для собственных нужд.
Сравненим возможности перечисленных библиотек. Из Таблицы 1.1 следует, что ни одна из библиотек, поставляемых вместе с.NET Framework, не позволяет читать CIL-код, хотя эта возможность требуется целому ряду метаинструментов (например, верификаторам и оптимизаторам кода).
Таблица 1.1 – CIL и системное программирование в Microsoft.NET
Функции\Название | Metadata Unmanaged | Reflection | AbstractIL | Mono.Cecil |
Чтение метаданных | + | + | + | + |
Генерация метаданных | + | + | + | + |
Чтение CIL-кода | - | - | + | + |
Генерация CIL-кода | - | + | + | + |
Из таблицы следует, что ни Metadata Unmanaged, ни Reflection, поставляемых вместе с.NET Framework, не позволяет читать CIL-код, хотя эта возможность требуется целому ряду метаинструментов (например, верификаторам и оптимизаторам кода). Поэтому выбор, какую библиотеку использовать остаётся между AbstractIL и Mono.Celic. Как было сказано выше Mono.Celic распространяется с открытым исходным кодом и имеется возможность подстроить её под свои нужды, потому выбрана она для использования в разработке.
А теперь, рассмотрев общие сведения о платформе.NET и основные инструкции языка CIL, а также библиотеки для создания метаинструментов, перейдем к описанию приемов, способов и алгоритмов «запутывания» программного обеспечения на уровне байт-кода технологии.NET.
Дата добавления: 2015-09-10; просмотров: 142 | Поможем написать вашу работу | Нарушение авторских прав |