Compartir a través de


Ejemplo Reflection Emit Technology

Actualización: noviembre 2007

Este ejemplo muestra cómo utilizar la emisión de la reflexión. La emisión de la reflexión es una característica en tiempo de ejecución que permite al código crear ensamblados, módulos y tipos dinámicos. Puede crear instancias de estos tipos de forma dinámica o bien utilizar la emisión de la reflexión para generar un ensamblado y conservarlo en el disco como archivo ejecutable o archivo DLL. Este ejemplo consta de dos aplicaciones ejecutables. El primer archivo ejecutable, EmitAssembly.exe, genera un tipo dinámico y lo prueba, o genera un tipo dinámico y lo conserva en el disco como archivo DLL. El segundo archivo ejecutable, TestEmittedAssembly.exe, simplemente prueba dinámicamente el ensamblado emitido por EmitAssembly.exe. El tipo emitido por EmitAssembly.exe es una clase simple denominada "HelloWorld" cuyo constructor toma un parámetro de cadena único. El tipo también implementa un método GetGreeting () que devuelve la cadena pasada al constructor de instancia.

Para obtener información sobre el uso de los ejemplos, consulte los temas siguientes:

Download sample

Para generar el ejemplo desde el símbolo del sistema

  1. Abra una ventana del símbolo del sistema y navegue hasta el subdirectorio específico de uno de los lenguajes para tener acceso al ejemplo.

  2. Escriba msbuild ReflectionEmitCS.sln o msbuild ReflectionEmitVB.sln, dependiendo del lenguaje de programación elegido, en la línea de comandos.

  3. Genere el ensamblado de prueba mediante la compilación de la clase EmitAssembly. Dependiendo de la opción de lenguaje de programación, escriba csc /target:library EmitAssembly.cs o vbc /target:library TestEmittedAssembly.vb en la línea de comandos. El archivo de resultados obtenido es EmitAssembly.dll.

Para generar el ejemplo mediante Visual Studio

  1. Abra el Explorador de Windows y navegue hasta el subdirectorio específico de uno de los lenguajes para tener acceso al ejemplo.

  2. Haga doble clic en el icono de ReflectionEmitCS.sln o ReflectionEmitVB.sln, dependiendo del lenguaje de programación elegido, para abrir el archivo en Visual Studio.

  3. En el menú Generar, seleccione Generar solución.

  4. Genere el ensamblado de prueba mediante la generación de la clase EmitAssembly. Cree un proyecto Biblioteca de clases utilizando el archivo EmitAssembly.cs o EmitAssembly.vb y genere el proyecto. El archivo de resultados obtenido es EmitAssembly.dll.

Para ejecutar el ejemplo

  1. Abra la ventana del símbolo del sistema y navegue hasta el directorio que contiene el nuevo archivo ejecutable.

  2. Escriba EmitAssembly.exe, seguido del valor que desea pasar como parámetro, en la línea de comandos.

Nota:

Este ejemplo genera una aplicación de consola. Para poder ver el resultado, debe iniciarla y ejecutarla en una ventana del símbolo del sistema.

Comentarios

Para obtener más información sobre la emisión de la reflexión, lea los comentarios de los archivos de código fuente.

Nota:

La herramienta MsBuild genera dos archivos ejecutables: EmitAssembly.exe y TestEmittedAssembly.exe. Sin embargo, para generar el archivo TestEmittedAssembly.exe, es necesario que el compilador pueda abrir el ensamblado "EmittedAssembly.dll" al que se hace referencia. Después de generar el archivo EmitAssembly.exe, la herramienta MsBuild ejecuta EmitAssembly con el parámetro de la línea de comandos "2", indicando que el ejemplo debe emitir el ensamblado dinámico.

El archivo ejecutable EmitAssembly acepta un parámetro de línea de comandos que indica qué comprobación debe ejecutar. El valor 1 hace que el ejemplo emita el tipo dinámico en su AppDomain y pruebe los miembros estáticos del ejemplo. El valor 2 hace que el ejemplo emita el tipo dinámico en un ensamblado y conserve el ensamblado en el disco, en forma de un archivo .DLL y un archivo .MOD. Después de hacer esto, conviene que ejecute el archivo TestEmittedAssembly.exe o ILDasm.exe para probar el código emitido.

Por ejemplo:

TestEmittedAssembly.exe

ILDasm EmittedModule.mod

El valor 3 hace que el ejemplo emita el tipo dinámico en un ensamblado y que emita un segundo tipo dinámico que pruebe el código del primer tipo dinámico.

El ejemplo utiliza las tecnologías y las clases siguientes:

  • AppDomain El ejemplo utiliza el tipo AppDomain para crear un ensamblado dinámico en el AppDomain del ejemplo. Esto lo hace llamando al método DefineDynamicAssembly.

  • AssemblyBuilder Se utiliza para generar un ensamblado dinámico. Puede utilizarse para crear un ensamblado de uso inmediato o un ensamblado dinámico que pueda conservarse en un archivo DLL o un archivo EXE.

  • AssemblyName Se emplea para definir la identidad única de un ensamblado. El ejemplo utiliza este tipo de la manera más simple posible, dando al ensamblado dinámico el nombre de texto "EmittedAssembly".

  • ModuleBuilder Se utiliza para generar un módulo dinámico en el ensamblado dinámico.

  • TypeBuilder Se utiliza para generar un tipo dinámicamente. Este tipo se deriva de Type. A partir de él se pueden solicitar instancias de los tipos FieldBuilder, ConstructorBuilder y MethodBuilder. Mediante el uso de estos tipos el ejemplo genera un tipo completo.

  • FieldBuilder Se utiliza para crear un campo en un tipo dinámico.

  • ConstructorBuilder Se utiliza para definir un constructor en un tipo dinámico.

  • MethodBuilder Se utiliza para definir un método en un tipo dinámico.

  • ILGenerator Tanto MethodBuilder como ConstructorBuilder implementan el método GetILGenerator. Estos métodos devuelven una instancia del tipo ILGenerator, que se emplea para generar dinámicamente el código del lenguaje intermedio de Microsoft (MSIL) para un tipo.

  • Thread Se emplea para obtener una instancia del tipo AppDomain para el subproceso actual.

Vea también

Referencia

AppDomain

AssemblyBuilder

AssemblyBuilderAccess

AssemblyName

ConstructorBuilder

FieldBuilder

ILGenerator

MethodAttributes

MethodBuilder

MethodInfo

ModuleBuilder

ResolveEventHandler

System.IO

System.Reflection

System.Reflection.Emit

System.Threading

TypeBuilder

Otros recursos

Reflexión

Emitir métodos y ensamblados dinámicos

Generación y compilación dinámicas de código fuente

Controlar y provocar eventos

Eventos administrados y no administrados