Esempio di tecnologia Reflection Emit
Aggiornamento: novembre 2007
In questo esempio viene illustrato come utilizzare la tecnologia Reflection Emit, ossia una funzionalità di runtime che consente al codice di creare assembly, moduli e tipi dinamici. È possibile creare in modo dinamico istanze di questi tipi oppure utilizzare tale funzionalità per generare un assembly e archiviarlo su disco come file eseguibile o DLL. Questo esempio è costituito da due eseguibili. Il primo, EmitAssembly.exe, genera un tipo dinamico e ne esegue il test oppure genera un tipo dinamico e lo archivia su disco come file DLL. Il secondo, TestEmittedAssembly.exe, esegue semplicemente il test dell'assembly creato dinamicamente da EmitAssembly.exe. Il tipo creato da EmitAssembly.exe è una classe semplice denominata "HelloWorld", il cui costruttore accetta come parametro una singola stringa. Il tipo implementa inoltre un metodo GetGreeting() che restituisce la stringa passata al costruttore di istanza.
Per informazioni sull'utilizzo degli esempi, vedere i seguenti argomenti:
Per compilare l'esempio utilizzando il prompt dei comandi
Aprire una finestra del prompt dei comandi, quindi spostarsi in una delle sottodirectory specifiche del linguaggio relative all'esempio.
Dalla riga di comando digitare msbuild ReflectionEmitCS.sln o msbuild ReflectionEmitVB.sln, a seconda del linguaggio di programmazione che si desidera utilizzare.
Generare l'assembly di test compilando la classe EmitAssembly. Dalla riga di comando digitare csc /target:library EmitAssembly.cs o vbc /target:library TestEmittedAssembly.vb, a seconda del linguaggio di programmazione che si desidera utilizzare. Il file di output risultante sarà EmitAssembly.dll.
Per compilare l'esempio utilizzando Visual Studio
Aprire Esplora risorse, quindi spostarsi in una delle sottodirectory specifiche del linguaggio relative all'esempio.
Fare doppio clic sull'icona relativa a ReflectionEmitCS.sln o ReflectionEmitVB.sln, a seconda del linguaggio di programmazione che si desidera utilizzare, per aprire il file in Visual Studio.
Scegliere Compila soluzione dal menu Compila.
Compilare l'assembly di test generando la classe EmitAssembly. Creare un progetto Libreria di classi utilizzando il file EmitAssembly.cs o EmitAssembly.vb e compilare il progetto. Il file di output risultante sarà EmitAssembly.dll.
Per eseguire l’esempio
Aprire la finestra del prompt dei comandi, quindi spostarsi nella directory contenente il nuovo eseguibile.
Dalla riga di comando digitare EmitAssembly.exe, seguito dal valore che si desidera passare come parametro.
Nota: |
---|
L'esempio compila un'applicazione console. Per visualizzare l'output dell'applicazione, è necessario avviarla ed eseguirla in una finestra del prompt dei comandi. |
Osservazioni
Per ulteriori informazioni sulla funzionalità Reflection Emit, vedere i commenti nei file di codice sorgente.
Nota: |
---|
Lo strumento MsBuild genera due file eseguibili, EmitAssembly.exe e TestEmittedAssembly.exe. Per generare TestEmittedAssembly.exe, tuttavia, il compilatore deve poter aprire l'assembly "EmittedAssembly.dll" a cui viene fatto riferimento. Dopo la compilazione di EmitAssembly.exe, lo strumento MsBuild esegue EmitAssembly con il parametro della riga di comando "2", per indicare che deve essere creato l'assembly dinamico. |
L'eseguibile EmitAssembly accetta un parametro della riga di comando che indica il test da eseguire. Se il valore del parametro è 1, verrà creato il tipo dinamico nel relativo AppDomain e verranno testati i membri statici contenuti nell'esempio. Se il valore è 2, verrà creato il tipo dinamico in un assembly e quest'ultimo verrà archiviato su disco come file DLL o MOD. A questo punto, sarà possibile eseguire TestEmittedAssembly.exe o ILDasm.exe per testare il codice creato.
Di seguito è riportato un esempio:
TestEmittedAssembly.exe
ILDasm EmittedModule.mod
Se il valore è 3, verrà creato il tipo dinamico in un assembly e quindi verrà creato un secondo tipo dinamico per testare il codice del primo tipo dinamico.
Nell'esempio vengono utilizzate le seguenti tecnologie e classi.
AppDomain - Il tipo AppDomain consente di creare un assembly dinamico nel tipo AppDomain dell'esempio mediante una chiamata al metodo DefineDynamicAssembly.
AssemblyBuilder - Consente di compilare un assembly dinamico, che può essere utilizzato immediatamente oppure archiviato su disco come file DLL o EXE.
AssemblyName - Consente di definire l'identità univoca di un assembly. Nell'esempio viene utilizzato semplicemente per assegnare il nome di testo "EmittedAssembly" all'assembly dinamico.
ModuleBuilder - Consente di compilare un modulo dinamico nell'assembly dinamico.
TypeBuilder - Consente di compilare dinamicamente un tipo derivato da Type. Può essere utilizzato per richiedere istanze dei tipi FieldBuilder, ConstructorBuilder e MethodBuilder. Utilizzando questi tipi, l'esempio genera un tipo completo.
FieldBuilder - Consente di creare un campo in un tipo dinamico.
ConstructorBuilder - Consente di definire un costruttore in un tipo dinamico.
MethodBuilder - Consente di definire un metodo in un tipo dinamico.
ILGenerator - Entrambe le classi MethodBuilder e ConstructorBuilder implementano il metodo GetILGenerator. Questi metodi restituiscono un'istanza del tipo ILGenerator, utilizzato per generare dinamicamente codice MSIL (Microsoft Intermediate Language) per un tipo.
Thread - Consente di ottenere un'istanza del tipo AppDomain per il thread corrente.
Vedere anche
Riferimenti
Altre risorse
Creazione di assembly e metodi dinamici
Generazione e compilazione dinamica di codice sorgente