2010-05-17 9 views

Répondre

6

Ceci est similaire dans l'esprit à ICorProfilerCallback::JITCompilationStarted lorsqu'il est associé à ICorProfilerInfo::SetILFunctionBody, mais avec plus de contraintes. Les classes ICorProfiler* peuvent être utilisées pour faire de l'instrumentation d'exécution pour presque toutes les méthodes gérées. Il existe des profileurs et des débogueurs qui les utilisent pour collecter des informations sur un processus en cours d'exécution.

Vous pouvez utiliser MethodRental pour coder l'instrument à des fins de diagnostic. Quelques exemples:

  • La fonction entrée/sortie vous donnerait une trace d'exécution que vous pourriez utiliser pour dériver des données de profilage.
  • Les primitives de synchronisation d'instrumentation peuvent vous aider à diagnostiquer les conditions de course. L'instrumentation des blocs de base peut vous aider à déterminer la couverture de code.

Vous pouvez également utiliser MethodRental pour améliorer la fonctionnalité du code existant. Aspect-oriented programming vient à l'esprit. Vous pourriez «tisser» dans la sécurité, la journalisation ou d'autres préoccupations de conception transversales dans le code existant. Cela nécessiterait une autre installation (XML, une bibliothèque C#) pour exprimer vos aspects, cependant. Enfin, vous pouvez utiliser MethodRental pour "détourner" le code existant, c'est-à-dire pour intercepter les appels de méthode afin de créer un type de polymorphisme d'exécution. Par exemple, si vous avez du code client qui utilise une classe RegistryStore générée dynamiquement pour obtenir une configuration via GetConfig, vous pouvez réécrire la méthode IL pour modifier l'implémentation de RegistryStore.GetConfig pour utiliser le système de fichiers à la place. Vous pouvez le faire sans avoir à changer le code client.

+0

Vous ne pouvez pas utiliser MethodRental pour AOP car il ne prend en charge que les méthodes dynamiques, n'est-ce pas? – Giorgi

+1

@Giorgi: désolé, je ne voulais pas être trompeur. Vous pouvez l'utiliser pour AOP, mais vous aurez toujours les mêmes contraintes imposées par 'MethodRental': spécifiquement, vous ne pouvez l'utiliser que sur des méthodes/assemblages dynamiques. Selon ce que vous essayez de faire, cela pourrait ne pas être utile du tout. Toutes les utilisations que j'ai énumérées ont cette même contrainte fondamentale, cependant. –

+0

Merci pour votre réponse. Comme la contrainte est très limitée, c'est parce que je ne pouvais pas penser à un usage possible. – Giorgi

6

Vous ne savez pas quelles sont les limitations que vous voulez dire. Clairement, cela ne peut fonctionner que sur des méthodes générées dynamiquement, produites par MethodBuilder. Les méthodes de classe qui ont été compilées à partir de IL chargé à partir d'un assembly ne peuvent pas être remplacées.

Un cas d'utilisation implémenterait une exécution pour un langage dynamique qui prend en charge la modification des méthodes de classes déjà définies (correction de singe). Langues comme Ruby, Python, Javascript, etc.