2012-03-18 14 views
8

Ho trovato alcuni metodi dinamici un po 'nel codice C# basato sulla riflessione, e devo ancora capire esattamente cosa sono. In particolare, sembra esserci una classe DynamicMethod che consente la generazione e la specifica dei metodi CLR in fase di esecuzione. Ma poi c'è anche la classe MethodBuilder. Entrambi sembrano fare cose molto simili. Apparentemente "assiemi dinamici" sono classi AssemblyBuilder e "tipi dinamici" sono classi TypeBuilder. Risiedono tutti nello spazio dei nomi System.Reflection.Emit in ogni caso.Quali sono i metodi dinamici e in che modo DynamicMethod è diverso da MethodBuilder?

MSDN sembra avere preziose informazioni di alto livello su questo argomento. Quindi, se qualcuno potesse spiegare quali sono i metodi dinamici, dove esattamente tutte le classi XYZBuilder entrano in gioco qui, e per cosa sono usate ciascuna, sarebbe fantastico. Qualsiasi altro tipo di Reflection.Emit e funzionalità che dovrei conoscere sarebbe apprezzato anche.

risposta

9

Penso the documentation for DynamicMethod spiega bene:

È possibile utilizzare la classe DynamicMethod di generare e eseguire un metodo in fase di esecuzione, senza dover generare un assembly dinamico e un tipo di dinamica per contenere il metodo. Il codice eseguibile creato dal compilatore just-in-time (JIT) viene recuperato quando l'oggetto DynamicMethod viene recuperato. I metodi dinamici sono il modo più efficiente per generare ed eseguire piccole quantità di codice.

Se è necessario creare dinamicamente uno o più metodi, utilizzare DynamicMethod. Se si desidera creare interi tipi, è necessario creare un assembly dinamico (AssemblyBuilder), quindi creare un modulo al suo interno (ModuleBuilder) e quindi creare uno o più tipi (TypeBuilder). Per creare metodi all'interno di questi tipi, devi utilizzare MethodBuilder.

Un'altra differenza è GC: DynamicMethod s può essere sempre garbage collection e vengono raccolti uno per uno. Cioè, qualsiasi metodo può essere raccolto non appena smetti di usarlo. Gli assiemi dinamici, d'altra parte, possono essere raccolti solo quando lo si specifica (usando AssemblyBuilderAccess.RunAndCollect) e vengono sempre raccolti assemblando per assemblaggio. Ad esempio, se si dispone di due tipi in un assieme e ne si utilizza solo uno, l'altro non può essere raccolto.

+0

Doh. Devo averlo perso leggendo le pagine MSDN così tardi. Grazie. – Noldorin

Problemi correlati