Вопрос по Reflection.Emit
От: SergASh  
Дата: 20.06.10 18:37
Оценка:
Привет всем!

При помощи Reflection.Emit создается класс A, в нем метод DoSomething, в котором надо иметь локальную переменную типа A. Проблема в том, что
ILGenerator.DeclareLocal требует аргумент типа Type, но Type для A можно получить только через TypeBuilder.CreateType(), а после этого вызова генерировать IL уже поздно. Это можно как-то обойти?

Спасибо.
Re: Вопрос по Reflection.Emit
От: Chriso  
Дата: 20.06.10 18:44
Оценка: 6 (1)
Здравствуйте, SergASh, Вы писали:

SAS>Привет всем!


SAS>При помощи Reflection.Emit создается класс A, в нем метод DoSomething, в котором надо иметь локальную переменную типа A. Проблема в том, что

SAS>ILGenerator.DeclareLocal требует аргумент типа Type, но Type для A можно получить только через TypeBuilder.CreateType(), а после этого вызова генерировать IL уже поздно. Это можно как-то обойти?

SAS>Спасибо.


Сейчас у меня нет возможности проверить, но, видимо, можно передать туда TypeBuilder ибо он наследуется от Type (аналогично можно использовать FieldBuilder, MethodBuilder и т.д.)
Re: Вопрос по Reflection.Emit
От: SergASh  
Дата: 20.06.10 19:33
Оценка:
Ещё пара вопросов

1. Компилятор C# иногда генерирует вот такую последовательность
    L_0057: ldc.i4.1 
    L_0058: ldc.i4.0 
    L_0059: ceq

Чем это отличается от просто ldc.i4.0 ?

2. Хотелось бы видеть в рефлекторе осмысленные имена локальных переменных. Делаю примерно так
var il = methodBuilder.GetILGenerator();
var localResult = il.DeclareLocal( typeof( bool ) );
localResult.SetLocalSymInfo( "result" );

// ................

moduleBuilder_ = assemblyBuilder_.DefineDynamicModule( moduleName, moduleName, true );

но никакого эффекта это не дает, рефлектор назначает имеа по своему разумению, в то время как имена переменных, определенные в C# коде, показываются нормально. В чем тут проблема?
Re[2]: Вопрос по Reflection.Emit
От: _FRED_ Черногория
Дата: 20.06.10 19:51
Оценка: +1
Здравствуйте, SergASh, Вы писали:

SAS>2. Хотелось бы видеть в рефлекторе осмысленные имена локальных переменных. Делаю примерно так


Имена локальных переменных в метаданных не хранятся. Что бы из увидеть, нужно иметь отладочные символы.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Вопрос по Reflection.Emit
От: SergASh  
Дата: 20.06.10 19:57
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, SergASh, Вы писали:


SAS>>2. Хотелось бы видеть в рефлекторе осмысленные имена локальных переменных. Делаю примерно так


_FR>Имена локальных переменных в метаданных не хранятся. Что бы из увидеть, нужно иметь отладочные символы.


Ну так а это на что?
moduleBuilder_ = assemblyBuilder_.DefineDynamicModule( moduleName, moduleName, true );
Третий параметр как раз и говорит сохранять символьную информацию. Соответствующий pdb появляется рядом со сборкой. Только это не даёт эффекта.
Re[4]: Вопрос по Reflection.Emit
От: _FRED_ Черногория
Дата: 21.06.10 07:19
Оценка:
Здравствуйте, SergASh, Вы писали:

SAS>>>2. Хотелось бы видеть в рефлекторе осмысленные имена локальных переменных. Делаю примерно так


_FR>>Имена локальных переменных в метаданных не хранятся. Что бы из увидеть, нужно иметь отладочные символы.


SAS>Ну так а это на что?
moduleBuilder_ = assemblyBuilder_.DefineDynamicModule( moduleName, moduleName, true );
Третий параметр как раз и говорит сохранять символьную информацию. Соответствующий pdb появляется рядом со сборкой. Только это не даёт эффекта.


  1. Дайте переменной какое-то "волшебное" имя a-la "abracadabra".
  2. Откройте .pdb каким-нить текстовым просмоторщиком (например, lister-ом от Total Commander) и поищите это имя — есть оно?
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.