2012-02-12 3 views
6

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

.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?

Enviroment Информация:

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

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

ответ

5

Поддержка отладки в 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); 

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

+0

Спасибо, я дам вам свою награду, когда смогу, (через 17 часов +200 очков), но не могу отметить это как правильный ответ (что это такое), поскольку я не задавал оригинальный вопрос! – thr

+0

Там мы идем, награда за награду, извините за задержку :) – thr

1

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

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

+0

Если вы посмотрите в примере, который я связал, автор вызывает 'AssemblyBuilder.DefinDynamicModule (string, string, true)'. Я также вижу, что в текущем каталоге есть файл SampleAssembly.pdb. –

1

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

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

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

+1

Я проверил файл .pdb, там ничего нет! – thr

 Смежные вопросы

  • Нет связанных вопросов^_^