Почему LocalBuilder.SetLocalSymInfo не генерирует имена переменных? - PullRequest
6 голосов
/ 13 февраля 2012

Я попытался запустить пример кода, который появляется на странице документации для класса System.Reflection.Emit.LocalBuilder , но кажется, что вызовы LocalBuilder.SetLocalSymInfo(string, int, int) ничего не делают, поскольку IL Dissasembler показывает это как IL для SampleAssembly.dll:

.method public static string  Function1(int32 A_0) cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init (string V_0,
           int32 V_1)
  IL_0000:  ldarg.0
  IL_0001:  stloc.1
  IL_0002:  ldstr      "string value"
  IL_0007:  stloc.0
  IL_0008:  ldloc.0
  IL_0009:  ret
} // end of method Example::Function1

Почему имена переменных (myString и myInt) не указаны в Dissasembler?

Информация об окружающей среде:

  • Windows 7 64 бит
  • Visual Studio 2010 Professional с пакетом обновления 1
  • .Net 4.0.30319 SP1
  • Целевая платформа: клиентский профиль .Net 4
  • Настройка отладки (для программы, использующей System.Reflection.Emit)

Редактировать: Как я отметил в комментарии, вместе с файлом SampleAssembly.dll создается файл SampleAssembly.pdb.

Ответы [ 3 ]

5 голосов
/ 05 февраля 2013

Поддержка отладки в System.Reflection.Emit довольно скудная и причудливая (и в некоторой степени это также верно для IKVM.Reflection, потому что она наследует некоторые неполадки из базового API-модуля записи .pdb, который должен быть используется, поскольку формат файла .pdb не задокументирован).

В любом случае причина, по которой образец не работает, заключается в том, что в нем отсутствует следующий код:

ISymbolDocumentWriter doc = myModule.DefineDocument("sourcefile", Guid.Empty, Guid.Empty, Guid.Empty);

myMethodIL.MarkSequencePoint(doc, 1, 0, 1, 0);

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

1 голос
/ 05 февраля 2013

Имена символов хранятся в файле PDB, а не в сборке.

Такой инструмент, как Reflector.NET, загрузит файл PDB, если он присутствует, чтобы дать вашему дизассемблированному коду правильные имена.

Вы также можете проверить это путем отладки кода в отладчике с файлом PDB и без него.

1 голос
/ 13 февраля 2012

Я подозреваю, что это потому, что вы строите модуль как DLL выпуска.

Попробуйте передать true в качестве второго параметра AssemblyBuilder.DefineDynamicModule

...