На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: maxim84_
  
> как и где хранятся метаданные? , рассмотрим подробнее
    Автор - Gazon
    Вопрос: как и где хранятся метаданные?
    Многие просматривают сборки через ILDasm.exe. Эта утилита позволяет просматривать IL код и метаданные в "красивом текстовом виде".
    Если просмотреть код ф-ии Main , которая до компиляции на языке C# выглядет так:
    ExpandedWrap disabled
       
      [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"
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0216 ]   [ 15 queries used ]   [ Generated: 27.04.24, 13:57 GMT ]