Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.38.3] |
|
Сообщ.
#1
,
|
|
|
Автор - Gazon
Вопрос: как и где хранятся метаданные? Многие просматривают сборки через ILDasm.exe. Эта утилита позволяет просматривать IL код и метаданные в "красивом текстовом виде". Если просмотреть код ф-ии Main , которая до компиляции на языке C# выглядет так: [STAThread]// Используем аттрибут, который отражается в метаданных static void Main(string[] args) { } то после компиляции эта ф-ия на IL будет выглядеть так: .method private hidebysig static void Main(string[] args) cil managed { .entrypoint .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) // Code size 2 (0x2) .maxstack 0 IL_0000: nop IL_0001: ret } // end of method Class1::Main Из этого кода мы видим, что все метаданные, такие как типы параметров ф-ии, ее возвращаемый тип, аттрибут System.STAThreadAttribute и др. содержатся непосредственно в коде IL. Сответственно многие и делают такой вывод, что метаданные содержатся в коде IL. На самом деле это не так. Код IL вообще не содержит никаких метаданных, более того, я скажу, что IL вообще не содержит никой информации о типах. Он содержит только инструкции о том, что класть в стек и эти инструкции нейтральны к типам. Подтверждением этому может служить цитата из интервью с Андерсом Хейлсбергом (Anders Hejlsberg) - ведущим разработчиком Microsoft: Цитата Цитата Решение предпочесть запуск native кода интерпретации, оказало большое влияние на форму IL. Это поменяло набор включенных инструкций, и порядок их расположения. Если вы посмотрите на два IL, то сможете отметить, что они очень разные. Чувствуется, что наш IL нейтрален к типам. Нет информации в инструкциях, которая говорила бы о типах аргументов. Только подразумевается, что было положено в стэк. Этот подход делает IL более компактным. JIT компилятору в любом случае нужна эта информация, так что нет смысла хранить ее в инструкциях. Теперь вы знаете о некоторых разных решениях, которые позволяют проще переводить IL в native код. Источник - интервью с ведущим разработчиком Microsoft - Андерсом Хейлсбергом (Anders Hejlsberg) А сами метаданные хранятся отдельно от кода IL, так называемых кучах(heaps). Статью про физическую организацию метаданных можно прочитать здесь Существует 5 хеапов: #~, #Strings, #US, #Blob, #GUID. Основной это - #~. В этой куче содержатся потоковые таблицы, в которых и размещены такие данные, как параматры ф-ий, их возвращаемые типы, имена ф-ий т.д.. Даже сам код IL явл. метаданными и также содержется в таблицах. Так вот когда приложение запускает ф-ию, CLR(среда выполнения) собирает все эти метаданные по таблицам и передает JIT компилятору, который в свою очередь создает двоичный-типозависимый код. Тоже самое делает и ILDasm, и вы видите удобное текстовое представление кода, думая что так он и выглядет, вы начинаете думать, что метаданные типов и типы содержатся непосредственно в самом IL коде. Хотя на самом деле при этом все типы и их метаданные находятся вне IL кода, а сам IL код содержит только нейтральные к типам инструкции, подразумевающими, что было положено в стек. Эта тема была разделена из темы "FAQ" |