Как декомпилировать pdb для получения исходного кода C #? - PullRequest
7 голосов
/ 05 июля 2011

Мой сценарий: я хочу написать в файле журнала часть кода, где произошло исключение (например, 5 строк до и 5 строк после строки, где произошло исключение - или, по крайней мере, весь код этого метода).

Моя идея состоит в том, чтобы декомпилировать файл pdb в коде C #, и из этого декомпилированного файла найти метод, который был исключен в блоке catch.

Файл Pbd существует, и мое приложение создается как отладочная версия.Я знаю, что есть инструменты, которые позволяют через его GUI (например, Reflector) выполнять декомпиляцию, но я хочу использовать эту функциональность в своем коде.

Как это сделать?

Ответы [ 3 ]

4 голосов
/ 05 июля 2011

PDB содержит отображение между MSIL и именем файла / номером строки источника. Это наиболее полезно, когда вы можете вернуться и посмотреть на исходные файлы, потому что декомпиляция обычно не сохраняет номера строк (хотя это может произойти, если она также использовала файл PDB). Он, конечно, не восстанавливает исходный код точно так, как написано, хотя с именами символов (также хранятся в PDB) он часто подходит близко.

2 голосов
/ 05 июля 2011

Загляните в исходный код ILSpy. Это альтернатива Reflector с открытым исходным кодом.

В частности, он использует библиотеки Mono.Cecil и Mono.Cecil.Pdb. Я подозреваю, что последний может помочь вам с тем, что вы хотите сделать.

Соответствующие части кода используют лицензию MIT, которая является разрешающей лицензией.

0 голосов
/ 05 июля 2011

Используйте отражение, чтобы получить исходный код исполняемого метода: System.Reflection.MethodBase.GetCurrentMethod().GetMethodBody();

Существует множество информации, которую можно получить с помощью членов MethodBase: http://msdn.microsoft.com/en-us/library/system.reflection.methodbase_methods.aspx

Также посмотрите здесь хороший пример получения информации MethodBase при обработке исключений: http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx#Y563

...