Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
Вопрос сначала получился не очень нормально составленный. Короче интересно понять как и где располагаются метаданные. Одни метаданные(метаданные о самой сборке) располагаются отдельно. Если добавить аттрибут к какому-нибудь типу в коде программы, то эти метаданные находятся среди кода IL, самого типа(например среди типа или определния ф-ии). Вот пример ф-ии Main на языке IL( тегом Код: plaintext выделено описание аттрибута[STATHREAD] в коде IL): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Если в ILDASM.exe при просмотре IL нажать Ctrl+M, то откроются метеданные всех типов. Вопрос: откуда берутся такие метаданные как кол-во переменных у ф-ии? Они где-то отдельно находятся или ILDASM.exe их просто щетает при просмотре отражения типов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2004, 23:27 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
это статья, опубликованная в RSDN Magazine #2-2003 Физическая организация метаданных в исполняемых файлах .NET надеюсь, поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2004, 00:46 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
Хорошо. С этим разобрались. Метаданные хранятся в потоковых таблицах. Теперь просматриваем IL код ф-ии Main с помощью ILDASM и видим: .method private hidebysig static void Main(string[] args) cil managed { .entrypoint .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) // Code size 7 (0x7) .maxstack 1 .locals init ([0] class aaa a) IL_0000: newobj instance void aaa::.ctor() IL_0005: stloc.0 IL_0006: ret } // end of method Class1::Main[/quot] Откуда взялись эти данные в коде? Эти метаданные хранятся и в самом IL коде? Если метаданные хранятся в таблицах то зачем их дублировать в коде? Или IL на самом деле не содержит никаких метаданных, а только двоичные инструкции , а это уже конечный результат IL кода после загрузки сборки в память? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2004, 07:22 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
Красныи цветом в коде выделены МЕТАДАННЫЕ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2004, 07:23 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
автор...Или IL на самом деле не содержит никаких метаданных, а только двоичные инструкции , а это уже конечный результат IL кода после загрузки сборки в памятьтолько не в память, а результат преобразования в текстовый вид. посмотри, например http://msdn.microsoft.com/net/ecma/ документ Common Language Infrastructure (CLI) Partition II: Metadata Definition and Semantics Produced by ECMA TC39/TG3 см. п.21.24.MethodDef : 0x06 private hidebysig static void - это текстовая подстановка a 2 byte bitmask of type MethodAttribute, clause 22.1.9 string[] args - текстовая подстановка данных из Blob (найденная по index into Blob heap ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2004, 09:08 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
что бы разобраться с этим, наверное можно пойти по пути созидания, т.е. самому вручную сгенерировать сборку, содержащую один класс, в котором, например, определен один метод Код: plaintext 1. 2. 3. 4. 5. 6. 7. это код, котый по Reflection.Emit генерит такую сборку Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. после таких экпериментов более 99% вопросов что, где и как хранится - как правило, исчезает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2004, 11:54 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
Понятно. Т.е. сам код IL не содержит метаданных, а содержит только инструкции. А при компиляции в двоичный код, метаданные компиоируются вместе с IL кодом, или они так и остаются в таблицах? Например есть ф-ия. до компиляции IL кода этой ф-ии ее параметры и другие типы хранятся в heap таблице, а тело ф-ии в ILинструкциях. Но ведь при компиляции в двоичный код типы парметров и др. типы компилятся вместе с телом этой ф-ии? Или они(метаданные) не компилируются, а CLR при исполнении ф-ии берет ее параметры и др. типы опять из таблиц, а тело ф-ии в двоичном виде берет уже из хеша после компиляции Jit'terom? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 11:17 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
Gazon...CLR при исполнении ф-ии берет ее параметры и др. типы опять из таблиц, а тело ф-ии в двоичном виде берет уже из хеша после компиляции Jit'terom? похоже, что так. вот, во что превратилась сборка после прохода NGen (статический собрат JIT), помещенная в GAC после NGen по ILDASM Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 12:20 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
кузя Gazon...CLR при исполнении ф-ии берет ее параметры и др. типы опять из таблиц, а тело ф-ии в двоичном виде берет уже из хеша после компиляции Jit'terom? похоже, что так. вот, во что превратилась сборка после прохода NGen (статический собрат JIT), помещенная в GAC после NGen по ILDASM Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. NGEN просто переводит весь IL код сборки(может и метаданные, уже и не знаю как правильно говорить) в native код. при этом из сборки не выкачивается тот код, который скомпилировался, а IL код остается в сборке при том что native код помещен в хеш. Т.е. это не показатель, поскольку надо смотреть не на сборку и ее IL, а на сам native. И смотреть надо после этого на native код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 13:07 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
т.е. в ней практически не осталось метаданных. только native код. Ты наверное хотел сказать что не осталось IL кода, а одни метаданные.? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 13:09 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
из мета данных после NGen остался только manifest. все внутренние вызовы в этой сборке - native, внешние - через метаданные исх. сборки с последующим вызовом уже native из откомпилированной (после NGen/JIT) сборки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 13:41 |
|
||
|
IL метаданные
|
|||
|---|---|---|---|
|
#18+
Короче разобрались. Все метаданные хранятся(кроме текстовых и некоторых двоичных) в потоковых таблицах. В этих таблицах хранится и сам IL код. IL код не содержит информации о типах, а содержит только инструкции по управлению данными этих типов. Т.е. если у нас есть какая-нибудь ф-ия, то IL содержит только тело этой ф-ии, т.е. он содержит только инструкции(на подобии что положить в стек), и при этом эти инструкции нейтральны к типам данных(т.е. сам IL не содержит никаких метаданных об этой ф-ии, а содержит только код, который должна выполнить эта ф-ия причем этот код не зависим от типа данных). Когда стартует компилятор в native код, он собирает информацию об этом методе(метаданные). Он находит тело метода - IL код тела метода(типо-независимые инструкции) и находит метаданные для данного метода(которые лежат отдельно). После этого он компиоирует метод(собирая его по отдельным кускам): Он компилит тело метода(типо-независимые инструкции IL) в типо-зависимые двоичные инструкции, вытаскивая инфу об этих типах из метаданных. Вместе с телом он компилит и сигнатуру метода(тоже собирая ее по отдельным кускам, т.к. такие данные как параметры и возврвщвемый тип метода в методанных находятся отдельно). В итоге получается готовая двоичная ф-ия с определенными типами. Такие метаданные как манифест, он ествественно при этом не трогает. Подтверждением этому служит статья о физической организации метаданных на RSDN и цитата ведущего разработчика microsoft: В итоге получается готовая двоичная ф-ия с определенными типами. авторРешение предпочесть запуск native кода интерпретации, оказало большое влияние на форму IL. Это поменяло набор включенных инструкций, и порядок их расположения. Если вы посмотрите на два IL, то сможете отметить, что они очень разные. Чувствуется, что наш IL нейтрален к типам. Нет информации в инструкциях, которая говорила бы о типах аргументов. Только подразумевается, что было положено в стэк. Этот подход делает IL более компактным. JIT компилятору в любом случае нужна эта информация, так что нет смысла хранить ее в инструкциях. Теперь вы знаете о некоторых разных решениях, которые позволяют проще переводить IL в native код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2004, 15:01 |
|
||
|
|

start [/forum/search_topic.php?author=tp_tnd&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
31ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 467ms |
| total: | 578ms |

| 0 / 0 |
