Compartir a través de


Clase System.Reflection.Emit.DynamicMethod

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

Puede usar la DynamicMethod clase para generar y ejecutar un método en tiempo de ejecución, sin tener que generar un ensamblado dinámico y un tipo dinámico para contener el método . El código ejecutable creado por el compilador Just-In-Time (JIT) se reclama cuando se reclama el DynamicMethod objeto. Los métodos dinámicos son la manera más eficaz de generar y ejecutar pequeñas cantidades de código.

Un método dinámico se puede hospedar de forma anónima o se puede asociar lógicamente a un módulo o a un tipo.

  • Si el método dinámico se hospeda de forma anónima, se encuentra en un ensamblado proporcionado por el sistema y, por tanto, está aislado de otro código. De forma predeterminada, no tiene acceso a ningún dato no público. Un método dinámico hospedado de forma anónima puede tener una capacidad restringida para omitir las comprobaciones de visibilidad del compilador JIT, si se ha concedido ReflectionPermission con la ReflectionPermissionFlag.RestrictedMemberAccess marca . El nivel de confianza del ensamblado al que el método dinámico tiene acceso a los miembros no públicos debe ser igual o un subconjunto de , el nivel de confianza de la pila de llamadas que emitió el método dinámico. Para obtener más información sobre los métodos dinámicos hospedados de forma anónima, vea Tutorial: Emisión de código en escenarios de confianza parcial.

  • Si el método dinámico está asociado a un módulo que especifique, el método dinámico es de forma eficaz global para ese módulo. Puede tener acceso a todos los tipos del módulo y a todos los internal miembros (Friend en Visual Basic) de los tipos. Puede asociar un método dinámico a cualquier módulo, independientemente de si creó el módulo, siempre que la pila de llamadas pueda satisfacer una demanda de ReflectionPermission con la RestrictedMemberAccess marca que incluya el código. Si la ReflectionPermissionFlag.MemberAccess marca se incluye en la concesión, el método dinámico puede omitir las comprobaciones de visibilidad del compilador JIT y acceder a los datos privados de todos los tipos declarados en el módulo o en cualquier otro módulo de cualquier ensamblado.

    Nota:

    Al especificar el módulo con el que está asociado un método dinámico, ese módulo no debe estar en el ensamblado proporcionado por el sistema que se usa para el hospedaje anónimo.

  • Si el método dinámico está asociado a un tipo que especifique, tiene acceso a todos los miembros del tipo, independientemente del nivel de acceso. Además, se pueden omitir las comprobaciones de visibilidad JIT. Esto proporciona al método dinámico acceso a los datos privados de otros tipos declarados en el mismo módulo o en cualquier otro módulo de cualquier ensamblado. Puede asociar un método dinámico con cualquier tipo, pero el código debe concederse ReflectionPermission con las RestrictedMemberAccess marcas y MemberAccess .

En la tabla siguiente se muestran los tipos y miembros a los que se puede acceder a un método dinámico hospedado de forma anónima, con y sin comprobaciones de visibilidad JIT, en función de si ReflectionPermission se concede la RestrictedMemberAccess marca .

Comprobaciones de visibilidad Sin RestrictedMemberAccess Con RestrictedMemberAccess
Sin omitir comprobaciones de visibilidad JIT Miembros públicos de tipos públicos en cualquier ensamblado. Miembros públicos de tipos públicos en cualquier ensamblado.
Omitir comprobaciones de visibilidad JIT, con restricciones Miembros públicos de tipos públicos en cualquier ensamblado. Todos los miembros de todos los tipos, solo en ensamblados cuyos niveles de confianza sean iguales o inferiores al nivel de confianza del ensamblado que emitió el método dinámico.

En la tabla siguiente se muestran los tipos y miembros a los que se puede acceder a un método dinámico asociado a un módulo o a un tipo de un módulo.

Omitir comprobaciones de visibilidad JIT Asociado con el módulo Asociado con el tipo
No Miembros públicos e internos de tipos públicos, internos y privados en el módulo.

Miembros públicos de tipos públicos en cualquier ensamblado.
Todos los miembros del tipo asociado. Miembros públicos e internos de todos los demás tipos del módulo.

Miembros públicos de tipos públicos en cualquier ensamblado.
Todos los miembros de todos los tipos de cualquier ensamblado. Todos los miembros de todos los tipos de cualquier ensamblado.

Un método dinámico asociado a un módulo tiene los permisos de ese módulo. Un método dinámico asociado a un tipo tiene los permisos del módulo que contiene ese tipo.

Los métodos dinámicos y sus parámetros no tienen que denominarse, pero puede especificar nombres para ayudar en la depuración. Los atributos personalizados no se admiten en métodos dinámicos ni en sus parámetros.

Aunque los métodos dinámicos son static métodos (Shared métodos en Visual Basic), las reglas relajadas para el enlace delegado permiten enlazar un método dinámico a un objeto, de modo que actúa como un método de instancia cuando se llama mediante esa instancia de delegado. Un ejemplo que muestra esto se proporciona para la sobrecarga del CreateDelegate(Type, Object) método.

Comprobación

En la lista siguiente se resumen las condiciones en las que los métodos dinámicos pueden contener código no verificable. (Por ejemplo, un método dinámico no se puede comprobar si su InitLocals propiedad está establecida falseen ).

  • Un método dinámico asociado a un ensamblado crítico para la seguridad también es crítico para la seguridad y puede omitir la comprobación. Por ejemplo, un ensamblado sin atributos de seguridad que se ejecuta como una aplicación de escritorio se trata como crítico para la seguridad en tiempo de ejecución. Si asocia un método dinámico con el ensamblado, el método dinámico puede contener código no verificable.
  • Si un método dinámico que contiene código no verificable está asociado a un ensamblado que tiene transparencia de nivel 1, el compilador Just-In-Time (JIT) inserta una demanda de seguridad. La demanda solo se realiza correctamente si el código de plena confianza ejecuta el método dinámico. Consulte Código transparente de seguridad, nivel 1.
  • Si un método dinámico que contiene código no verificable está asociado a un ensamblado que tiene transparencia de nivel 2 (como mscorlib.dll), produce una excepción (insertada por el compilador JIT) en lugar de hacer una demanda de seguridad. Consulte Código transparente de seguridad, nivel 2.
  • Un método dinámico hospedado de forma anónima que contiene código no verificable siempre produce una excepción. Nunca puede omitir la comprobación, incluso si se crea y ejecuta mediante código de plena confianza.

La excepción que se produce para código no verificable varía en función de la forma en que se invoca el método dinámico. Si invoca un método dinámico mediante un delegado devuelto desde el CreateDelegate método , se produce una VerificationException excepción . Si invoca el método dinámico mediante el Invoke método , se produce una TargetInvocationException excepción con un elemento interno VerificationException.