powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / IL метаданные
12 сообщений из 12, страница 1 из 1
IL метаданные
    #32731421
Gazon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос сначала получился не очень нормально составленный.

Короче интересно понять как и где располагаются метаданные. Одни метаданные(метаданные о самой сборке) располагаются отдельно.
Если добавить аттрибут к какому-нибудь типу в коде программы, то эти метаданные находятся среди кода IL, самого типа(например среди типа или определния ф-ии).
Вот пример ф-ии Main на языке IL( тегом
Код: plaintext
[color=red][/color]

выделено описание аттрибута[STATHREAD] в коде IL):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
[color=red].custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )[/color]
 // 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 
 


Если в ILDASM.exe при просмотре IL нажать Ctrl+M, то откроются метеданные всех типов.
Вопрос: откуда берутся такие метаданные как кол-во переменных у ф-ии? Они где-то отдельно находятся
или ILDASM.exe их просто щетает при просмотре отражения типов?
...
Рейтинг: 0 / 0
IL метаданные
    #32731435
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это статья, опубликованная в RSDN Magazine #2-2003

Физическая организация метаданных в исполняемых файлах .NET

надеюсь, поможет
...
Рейтинг: 0 / 0
IL метаданные
    #32731466
Gazon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо. С этим разобрались. Метаданные хранятся в потоковых таблицах.
Теперь просматриваем 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 кода после загрузки сборки в память?
...
Рейтинг: 0 / 0
IL метаданные
    #32731467
Gazon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Красныи цветом в коде выделены МЕТАДАННЫЕ
...
Рейтинг: 0 / 0
IL метаданные
    #32731501
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор...Или 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 )
...
Рейтинг: 0 / 0
IL метаданные
    #32731820
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что бы разобраться с этим, наверное можно пойти по пути созидания,
т.е. самому вручную сгенерировать сборку, содержащую один класс,
в котором, например, определен один метод
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public ClassABC        // класс 
{
  public ClassABC(){}  // его конструктор 
  public void main()   // его единственный метод 
  {
    return;
  }
}

это код, котый по Reflection.Emit генерит такую сборку
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
AppDomain domain=Thread.GetDomain();
AssemblyName asmName        =new AssemblyName();
asmName.Name                ="simpleMain";
AssemblyBuilder asmBuilder  =domain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder module        =asmBuilder.DefineDynamicModule("ConsoleApp", "ConsoleApp.dll");

 // создаем тип (класс ClassABC)  
TypeBuilder typeBld         =module.DefineType("ClassABC", TypeAttributes.Public);
 // генерируем его конструктор: public ClassABC(){ return; } 
ConstructorBuilder typeCtor =typeBld.DefineConstructor(MethodAttributes.Public,	CallingConventions.Standard, new Type[0]);			
ILGenerator ctorIL          =typeCtor.GetILGenerator();  // кодогенератор конструктора 
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Call, Type.GetType("System.Object").GetConstructor(new Type[0])); 
ctorIL.Emit(OpCodes.Ret);
 // создаем и генерируем метод: public void main(){ return; };  
MethodBuilder	mainMthd    =typeBld.DefineMethod("main", MethodAttributes.Public, typeof(void), new Type[0]);
ILGenerator mthdIL          =mainMthd.GetILGenerator();  // кодогенератор метода 
mthdIL.Emit(OpCodes.Ret);	
 // завершить формирование типа  
typeBld.CreateType(); 
 // и записать в файл сборку 
asmBuilder.Save(module.Name);

после таких экпериментов более 99% вопросов что, где и как хранится - как правило, исчезает :)
...
Рейтинг: 0 / 0
IL метаданные
    #32733508
Gazon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятно. Т.е. сам код IL не содержит метаданных, а содержит только инструкции. А при компиляции в двоичный код, метаданные компиоируются вместе с IL кодом, или они так и остаются в таблицах?
Например есть ф-ия. до компиляции IL кода этой ф-ии ее параметры и другие типы хранятся в heap таблице, а тело ф-ии в ILинструкциях. Но ведь при компиляции в двоичный код типы парметров и др. типы компилятся вместе с телом этой ф-ии? Или они(метаданные) не компилируются, а CLR при исполнении ф-ии берет ее параметры и др. типы опять из таблиц, а тело ф-ии в двоичном виде берет уже из хеша после компиляции Jit'terom?
...
Рейтинг: 0 / 0
IL метаданные
    #32733667
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
  .ver 1:0:5000:0
}
.assembly simpleMain
{
  .permissionset prejitgrant = ( ... )             
  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.imagebase 0x672f0000
.subsystem 0x00000003
.file alignment 512
.corflags 0x00000006
// Image base: 0x030e0000
т.е. в ней практически не осталось метаданных. только native код.
...
Рейтинг: 0 / 0
IL метаданные
    #32733859
gazon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кузя 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.
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
  .ver 1:0:5000:0
}
.assembly simpleMain
{
  .permissionset prejitgrant = ( ... )             
  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.imagebase 0x672f0000
.subsystem 0x00000003
.file alignment 512
.corflags 0x00000006
// Image base: 0x030e0000
т.е. в ней практически не осталось метаданных. только native код.


NGEN просто переводит весь IL код сборки(может и метаданные, уже и не знаю как правильно говорить) в native код.
при этом из сборки не выкачивается тот код, который скомпилировался, а IL код остается в сборке при том что native код помещен в хеш.
Т.е. это не показатель, поскольку надо смотреть не на сборку и ее IL, а на сам native.

И смотреть надо после этого на native код.
...
Рейтинг: 0 / 0
IL метаданные
    #32733870
gazon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е. в ней практически не осталось метаданных. только native код.
Ты наверное хотел сказать что не осталось IL кода, а одни метаданные.?
...
Рейтинг: 0 / 0
IL метаданные
    #32733956
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из мета данных после NGen остался только manifest.
все внутренние вызовы в этой сборке - native, внешние - через метаданные исх. сборки с последующим вызовом уже native из откомпилированной (после NGen/JIT) сборки.
...
Рейтинг: 0 / 0
IL метаданные
    #32734242
Gazon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче разобрались.
Все метаданные хранятся(кроме текстовых и некоторых двоичных) в потоковых таблицах. В этих таблицах хранится и сам IL код. IL код не содержит информации о типах, а содержит только инструкции по управлению данными этих типов. Т.е. если у нас есть какая-нибудь ф-ия, то IL содержит только тело этой ф-ии, т.е. он содержит только инструкции(на подобии что положить в стек), и при этом эти инструкции нейтральны к типам данных(т.е. сам IL не содержит никаких метаданных об этой ф-ии, а содержит только код, который должна выполнить эта ф-ия причем этот код не зависим от типа данных).

Когда стартует компилятор в native код, он собирает информацию об этом методе(метаданные). Он находит тело метода - IL код тела метода(типо-независимые инструкции) и находит метаданные для данного метода(которые лежат отдельно). После этого он компиоирует метод(собирая его по отдельным кускам):
Он компилит тело метода(типо-независимые инструкции IL) в типо-зависимые двоичные инструкции, вытаскивая инфу об этих типах из метаданных.
Вместе с телом он компилит и сигнатуру метода(тоже собирая ее по отдельным кускам, т.к. такие данные как параметры и возврвщвемый тип метода в методанных находятся отдельно).

В итоге получается готовая двоичная ф-ия с определенными типами.
Такие метаданные как манифест, он ествественно при этом не трогает.

Подтверждением этому служит статья о физической организации метаданных на RSDN и цитата ведущего разработчика microsoft:
В итоге получается готовая двоичная ф-ия с определенными типами.
авторРешение предпочесть запуск native кода интерпретации, оказало большое влияние на форму IL. Это поменяло набор включенных инструкций, и порядок их расположения. Если вы посмотрите на два IL, то сможете отметить, что они очень разные. Чувствуется, что наш IL нейтрален к типам. Нет информации в инструкциях, которая говорила бы о типах аргументов. Только подразумевается, что было положено в стэк. Этот подход делает IL более компактным. JIT компилятору в любом случае нужна эта информация, так что нет смысла хранить ее в инструкциях. Теперь вы знаете о некоторых разных решениях, которые позволяют проще переводить IL в native код.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / IL метаданные
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]