7
votes

Comment décompiler PDB pour obtenir le code source C #?

Mon scénario: Je souhaite écrire dans une partie du fichier journal du code où une exception est arrivée (par exemple 5 lignes avant et 5 lignes après ligne, où une exception s'est produite - ou au moins tout le code de cette méthode).

Mon idée est de décompiler le fichier PDB dans le code C # et de ce fichier décompilé, trouvez une méthode qui s'est passée à l'exception du bloc de capture.

fichier PBD existe et mon application est construite comme version de débogage. Je sais qu'il existe des outils qui permettent à travers son interface graphique (par exemple le réflecteur) pour décompiler, mais je veux avoir cette fonctionnalité de mon code.

Comment faire?


1 commentaires

Le CLR utilise déjà le fichier .pdb. C'est ce qui produit le code source et les annotations de numéro de ligne à l'exception de StackTrace. Comparez-vous à la trace de la pile que vous obtenez sans le fichier .pdb en place pour voir la différence. Il ne sert à rien de chercher plus, c'est ce qui est possible.


3 Réponses :


2
votes

Regardez dans le code source de ILSPY. C'est une alternative open source pour le réflecteur.

En particulier, il utilise les bibliothèques mono.cecil et mono.cecil.pdb . Je soupçonne que ce dernier peut vous aider avec ce que vous voulez faire.

Les pièces de code pertinentes utilisent la licence MIT, qui est une licence permissive.


4 commentaires

Veuillez éviter ILSPY et utiliser le réflecteur, vous vous sauverrez quelques problèmes.


@ Bartoszwójcik Pourriez-vous s'il vous plaît expliquer pourquoi utiliser mono.cecil.pdb n'est-il pas un bon choix?


La même raison DE4DOT abandonnée mono.cecil pour les manipulations .NET


@ Bartoszwójcik Comment intégreriez-vous le réflecteur dans votre application pour générer des informations de débogage prolongées? Sa licence permet-elle même cela?



5
votes

Le PDB contient le mappage entre MSIL et le nom de fichier / numéro de ligne source. Ceci est très utile lorsque vous pouvez revenir en arrière et regarder les fichiers source d'origine, car la décompilation ne préserve généralement pas les numéros de ligne (bien que cela puisse également utiliser le fichier PDB). Cela ne récupère certainement pas le code d'origine exactement comme écrit, bien que les noms de symboles (aussi stockés dans la PDB), il s'approche souvent.


0 commentaires

-1
votes

Utilisez la réflexion pour obtenir le code source de la méthode d'exécution: System.reflection.Methodbase.getCurrentMethod (). getMethodbody ();

Il existe une variété d'informations que vous pouvez utiliser ModyBase Membres: http://msdn.microsoft.com/en-us/library/system.reflet.methodbase_methods.aspx

Regardez également ici pour un bon exemple pour obtenir une méthode Base info tandis que la manipulation des exceptions: http://msdn.microsoft.com/en-us/library/system.reflection.Methodbase.getMethodbody.aspx#y563


1 commentaires

GetMethodbody () ne me permet pas de voir le code source de la méthode.