2010-05-17 14 views
12

In base a MSDN MethodRental Class consente di modificare il corpo del metodo dei moduli dinamici. Tuttavia a causa dei suoi limiti non riesco a pensare a usi pratici per questo. Neanche Google mi ha aiutato.Usi pratici di MethodRental Class?

Qualche idea su cosa può essere utilizzata la classe?

risposta

6

Questo è simile nello spirito a ICorProfilerCallback::JITCompilationStarted quando accoppiato con ICorProfilerInfo::SetILFunctionBody, ma con più vincoli. Le classi ICorProfiler* possono essere utilizzate per eseguire la strumentazione runtime per quasi tutti i metodi gestiti. Esistono profiler e debugger che li utilizzano per raccogliere informazioni su un processo in esecuzione.

È possibile utilizzare MethodRental nel codice dello strumento per scopi diagnostici. Alcuni esempi:

  • Funzione enter/exit fornirebbe una traccia di esecuzione che è possibile utilizzare per ricavare dati di profilatura da.
  • Le primitive di sincronizzazione dello strumento possono aiutarti a diagnosticare condizioni di gara.
  • La strumentazione dei blocchi di base può aiutare a determinare la copertura del codice.

È inoltre possibile utilizzare MethodRental per migliorare la funzionalità del codice esistente. Mi viene in mente Aspect-oriented programming. Si potrebbe "tessere" in sicurezza, logging o altri problemi di progettazione trasversali nel codice esistente. Ciò richiederebbe qualche altra funzione (XML, una libreria C#) per esprimere i tuoi aspetti, comunque.

Infine, è possibile utilizzare MethodRental per "deviare" il codice esistente, ad esempio le chiamate al metodo di intercettazione per creare un tipo di polimorfismo di runtime. Ad esempio, se si dispone di codice client che utilizza una classe generata dinamicamente RegistryStore per ottenere una configurazione tramite GetConfig, è possibile riscrivere l'IL del metodo per modificare l'implementazione di RegistryStore.GetConfig per utilizzare invece il file system. Puoi farlo senza dover cambiare il codice cliente.

+0

Non è possibile utilizzare MethodRental per AOP poiché supporta solo metodi dinamici, puoi? – Giorgi

+1

@Giorgi: scusa, non volevo essere fuorviante. Puoi usarlo per AOP, ma avrai ancora gli stessi vincoli che 'MethodRental' impone: in particolare, puoi usarlo solo su metodi/assiemi dinamici. A seconda di cosa stai cercando di fare, potrebbe non essere affatto utile. Tutti gli usi che ho elencato hanno lo stesso vincolo fondamentale, però. –

+0

Grazie per la risposta. Poiché il vincolo è molto limitato, è perché non riesco a pensare a un possibile utilizzo. – Giorgi

6

Non sono sicuro quali sono le limitazioni che intendi. Chiaramente questo può funzionare solo su metodi generati dinamicamente, prodotti da MethodBuilder. I metodi di classe che erano JIT compilati da IL caricati da un assembly non possono essere sostituiti.

Un caso d'uso sarebbe l'implementazione di un runtime per un linguaggio dinamico che supporta l'alterazione dei metodi di classi già definite (patch di scimmia). Lingue come Ruby, Python, Javascript ecc.