Facile d'injecter du code à toutes les méthodes et propriétés qui n'ont pas d'attribut personnalisé
Il y a beaucoup de questions et de réponses autour de AOP dans .NET ici sur Pile Overflow, souvent de mentionner PostSharp et d'autres produits tiers. Il semble donc y avoir une variété de l'AOP optons dans le .NET et C# monde. Mais chacun de ceux a ses restrictions, et après le téléchargement de la promesse de PostSharp j'ai trouvé dans leur documentation que "des méthodes de virtuelle", afin d'être en mesure d'injecter du code (edit: voir ChrisWue la réponse de mon commentaire - le virtuel contrainte doit avoir été sur l'un des prétendants, je suppose). Je n'ai pas enquêté sur l'exactitude de cette déclaration, mais c'est categoricality m'a fait revenir en arrière à Pile Overflow.
Donc je voudrais avoir une réponse à cette question très précise:
Je veux injecter simple "si (condition) de la Console.WriteLine" style code de chaque méthode et de propriété (statique, scellé, interne, du virtuel, de la non-virtuel, n'a pas d'importance) dans mon projet, qui n'ont pas d'annotations personnalisées, afin de testez mon logiciel au moment de l'exécution. Cette injection de code ne doit pas rester dans la version de publication, il est conçu pour l'essai dynamique (thread) au cours du développement.
Quelle est la meilleure façon de le faire? Je suis tombé sur Mono.Cecil, qui a l'air idéal, sauf que vous semblez avoir à écrire le code que vous voulez injecter dans IL. Ce n'est pas un énorme problème, il est facile à utiliser en Mono.Cecil pour obtenir un IL version de code écrit en C#. Mais néanmoins, si il y avait quelque chose de plus simple, idéalement même, construite dans .NET (je suis toujours sur .NET 3.5), je voudrais savoir. [Mise à jour: Si l'outil n'est pas de la partie .NET Framework, il serait bien si c'était open-source, comme Mono.Cecil, ou librement disponible]
OriginalL'auteur Eugene Beresovsky | 2011-07-12
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure de résoudre le problème avec Mono.Cecil. Je suis toujours étonné de voir comment il est facile à apprendre, facile à utiliser, et il est puissant. L'absence presque complète de la documentation n'a pas changé.
Ce sont les 3 sources de documentation, j'ai utilisé:
Le premier lien fournit une introduction en douceur, mais comme il est décrit une version plus ancienne de Cecil - et beaucoup de choses ont changé dans l'intervalle - le second lien a été très utile dans la traduction de l'introduction à Cecil 0.9. Après la mise en route, l' (également non documenté) le code source a été inestimable et a répondu à toutes les questions que j'avais - attendez-vous peut-être ceux de la .NET plate-forme en général, mais il y a des tonnes de livres et du matériel sur que quelque part en ligne, j'en suis sûr.
Je peux maintenant prendre une DLL ou EXE fichier, le modifier, et de les écrire sur le disque. La seule chose que je n'ai pas encore la fin est de savoir comment garder les informations de débogage - nom de fichier, numéro de ligne, etc. actuellement perdus après l'écriture de la DLL ou EXE fichier. Mon arrière-plan n'est pas .NET, donc je suppose ici, et j'imagine que j'ai besoin de regarder
mono.cecil.pdb
pour résoudre ce problème. Quelque part plus tard - c'est pas super important pour moi. Je suis la création de ce fichier EXE, exécutez l'application et c'est un complexe d'interface graphique de l'application, développée au fil des années avec tous les bagages que vous attendez à trouver dans un morceau de, ahem, le logiciel et il vérifie les choses et les journaux d'erreurs pour moi.Voici l'essentiel de mon code:
Si quelqu'un connaît un moyen plus facile de comment obtenir ce fait, je suis toujours intéressé par une réponse et que je ne marque pas cela comme une solution, sauf si aucune des solutions plus simples pour se manifester.
OriginalL'auteur Eugene Beresovsky