При помощи Reflection.Emit создается класс A, в нем метод DoSomething, в котором надо иметь локальную переменную типа A. Проблема в том, что
ILGenerator.DeclareLocal требует аргумент типа Type, но Type для A можно получить только через TypeBuilder.CreateType(), а после этого вызова генерировать IL уже поздно. Это можно как-то обойти?
Здравствуйте, SergASh, Вы писали:
SAS>Привет всем!
SAS>При помощи Reflection.Emit создается класс A, в нем метод DoSomething, в котором надо иметь локальную переменную типа A. Проблема в том, что SAS>ILGenerator.DeclareLocal требует аргумент типа Type, но Type для A можно получить только через TypeBuilder.CreateType(), а после этого вызова генерировать IL уже поздно. Это можно как-то обойти?
SAS>Спасибо.
Сейчас у меня нет возможности проверить, но, видимо, можно передать туда TypeBuilder ибо он наследуется от Type (аналогично можно использовать FieldBuilder, MethodBuilder и т.д.)
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# коде, показываются нормально. В чем тут проблема?
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, SergASh, Вы писали:
SAS>>2. Хотелось бы видеть в рефлекторе осмысленные имена локальных переменных. Делаю примерно так
_FR>Имена локальных переменных в метаданных не хранятся. Что бы из увидеть, нужно иметь отладочные символы.
Здравствуйте, SergASh, Вы писали:
SAS>>>2. Хотелось бы видеть в рефлекторе осмысленные имена локальных переменных. Делаю примерно так
_FR>>Имена локальных переменных в метаданных не хранятся. Что бы из увидеть, нужно иметь отладочные символы.
SAS>Ну так а это на что?
Третий параметр как раз и говорит сохранять символьную информацию. Соответствующий pdb появляется рядом со сборкой. Только это не даёт эффекта.
Дайте переменной какое-то "волшебное" имя a-la "abracadabra".
Откройте .pdb каким-нить текстовым просмоторщиком (например, lister-ом от Total Commander) и поищите это имя — есть оно?
Help will always be given at Hogwarts to those who ask for it.