DynamicMethod Constructores

Definición

Crea un método dinámico.

Sobrecargas

Nombre Description
DynamicMethod(String, Type, Type[])

Inicializa un método dinámico hospedado de forma anónima, especificando el nombre del método, el tipo de valor devuelto y los tipos de parámetro.

DynamicMethod(String, Type, Type[], Boolean)

Inicializa un método dinámico hospedado de forma anónima, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetros y si las comprobaciones de visibilidad Just-In-Time (JIT) deben omitirse para los tipos y miembros a los que accede el lenguaje intermedio (MSIL) de Microsoft del método dinámico.

DynamicMethod(String, Type, Type[], Module)

Crea un método dinámico que es global para un módulo, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetro y el módulo.

DynamicMethod(String, Type, Type[], Type)

Crea un método dinámico, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetro y el tipo con el que el método dinámico está asociado lógicamente.

DynamicMethod(String, Type, Type[], Module, Boolean)

Crea un método dinámico global para un módulo, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetros, el módulo y si las comprobaciones de visibilidad Just-In-Time (JIT) deben omitirse para los tipos y miembros a Microsoft los que tiene acceso el lenguaje intermedio (MSIL) del método dinámico.

DynamicMethod(String, Type, Type[], Type, Boolean)

Crea un método dinámico, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetros, el tipo con el que está asociado lógicamente el método dinámico y si las comprobaciones de visibilidad Just-In-Time (JIT) deben omitirse para los tipos y miembros a Microsoft los que accede el lenguaje intermedio (MSIL) del método dinámico.

DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Module, Boolean)

Crea un método dinámico global para un módulo, especificando el nombre del método, los atributos, la convención de llamada, el tipo de valor devuelto, los tipos de parámetros, el módulo y si las comprobaciones de visibilidad Just-In-Time (JIT) deben omitirse para los tipos y miembros a los que accede el lenguaje intermedio (MSIL) de Microsoft del método dinámico.

DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type, Boolean)

Crea un método dinámico, especificando el nombre del método, los atributos, la convención de llamada, el tipo de valor devuelto, los tipos de parámetros, el tipo con el que está asociado lógicamente el método dinámico y si las comprobaciones de visibilidad Just-In-Time (JIT) deben omitirse para los tipos y miembros a Microsoft los que accede el lenguaje intermedio (MSIL) del método dinámico.

DynamicMethod(String, Type, Type[])

Inicializa un método dinámico hospedado de forma anónima, especificando el nombre del método, el tipo de valor devuelto y los tipos de parámetro.

public:
 DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes);
public DynamicMethod(string name, Type returnType, Type[] parameterTypes);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type())

Parámetros

name
String

Nombre del método dinámico. Puede ser una cadena de longitud cero, pero no puede ser null.

returnType
Type

Objeto Type que especifica el tipo de valor devuelto del método dinámico o null si el método no tiene ningún tipo de valor devuelto.

parameterTypes
Type[]

Matriz de Type objetos que especifican los tipos de los parámetros del método dinámico o null si el método no tiene parámetros.

Excepciones

Un elemento de parameterTypes es null o Void.

name es null.

.NET Framework y .NET Core versiones anteriores a la 2.1: returnType es un tipo para el que IsByRef devuelve true.

Comentarios

El método dinámico creado por este constructor está asociado a un ensamblado anónimo en lugar de a un tipo o módulo existente. El ensamblado anónimo solo existe para proporcionar un entorno de espacio aislado para los métodos dinámicos, es decir, para aislarlos de otro código. Este entorno hace que sea seguro que el método dinámico se emita y ejecute mediante código de confianza parcial.

Este constructor especifica que se aplicarán comprobaciones de visibilidad Just-In-Time (JIT) para la Microsoft lenguaje intermedio (MSIL) del método dinámico. Es decir, el código del método dinámico tiene acceso a métodos públicos de clases públicas. Las excepciones se producen si el método intenta tener acceso a tipos o miembros private, protected o internal (Friend en Visual Basic). Para crear un método dinámico que tenga una capacidad restringida para omitir las comprobaciones de visibilidad JIT, use el DynamicMethod(String, Type, Type[], Boolean) constructor .

Cuando se construye un método dinámico hospedado de forma anónima, se incluye la pila de llamadas del ensamblado emisor. Cuando se invoca el método , se usan los permisos del ensamblado emisor en lugar de los permisos del autor de la llamada real. Por lo tanto, el método dinámico no puede ejecutarse en un nivel de privilegio mayor que el del ensamblado que lo emitió, incluso si se pasa a un ensamblado que tiene un nivel de confianza superior y lo ejecuta.

Este constructor especifica los atributos MethodAttributes.Public del método y MethodAttributes.Static, y la convención CallingConventions.Standardde llamada .

Note

Este constructor se introdujo en .NET Framework 3.5 o posterior.

Consulte también

Se aplica a

DynamicMethod(String, Type, Type[], Boolean)

Inicializa un método dinámico hospedado de forma anónima, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetros y si las comprobaciones de visibilidad Just-In-Time (JIT) deben omitirse para los tipos y miembros a los que accede el lenguaje intermedio (MSIL) de Microsoft del método dinámico.

public:
 DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, bool restrictedSkipVisibility);
public DynamicMethod(string name, Type returnType, Type[] parameterTypes, bool restrictedSkipVisibility);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), restrictedSkipVisibility As Boolean)

Parámetros

name
String

Nombre del método dinámico. Puede ser una cadena de longitud cero, pero no puede ser null.

returnType
Type

Objeto Type que especifica el tipo de valor devuelto del método dinámico o null si el método no tiene ningún tipo de valor devuelto.

parameterTypes
Type[]

Matriz de Type objetos que especifican los tipos de los parámetros del método dinámico o null si el método no tiene parámetros.

restrictedSkipVisibility
Boolean

true para omitir las comprobaciones de visibilidad JIT en los tipos y miembros a los que accede el MSIL del método dinámico, con esta restricción: el nivel de confianza de los ensamblados que contienen esos tipos y miembros debe ser igual o menor que el nivel de confianza de la pila de llamadas que emite el método dinámico; de lo contrario, false.

Excepciones

Un elemento de parameterTypes es null o Void.

name es null.

.NET Framework y .NET Core versiones anteriores a la 2.1: returnType es un tipo para el que IsByRef devuelve true.

Comentarios

El método dinámico creado por este constructor está asociado a un ensamblado anónimo en lugar de a un tipo o módulo existente. El ensamblado anónimo solo existe para proporcionar un entorno de espacio aislado para los métodos dinámicos, es decir, para aislarlos de otro código. Este entorno hace que sea seguro que el método dinámico se emita y ejecute mediante código de confianza parcial.

Los métodos dinámicos hospedados de forma anónima no tienen acceso automático a ningún tipo o miembros que estén private, protected o internal (Friend en Visual Basic). Esto es diferente de los métodos dinámicos asociados a un tipo o módulo existente, que tienen acceso a miembros ocultos en su ámbito asociado.

Especifique true para restrictedSkipVisibility si el método dinámico tiene que tener acceso a tipos o miembros que son private, protectedo internal. Esto proporciona al método dinámico acceso restringido a estos miembros. Es decir, solo se puede acceder a los miembros si se cumplen las condiciones siguientes:

  • Los miembros de destino pertenecen a un ensamblado que tiene un nivel de confianza igual o inferior a la pila de llamadas que emite el método dinámico.

  • La pila de llamadas que emite el método dinámico se otorga ReflectionPermission con la bandera ReflectionPermissionFlag.RestrictedMemberAccess. Esto siempre es cierto cuando el código se ejecuta con plena confianza. Para el código de confianza parcial, solo es true si el host concede explícitamente el permiso.

    Importante

    Si no se ha concedido el permiso, se produce una excepción de seguridad cuando CreateDelegate se llama a o cuando se invoca el método dinámico, no cuando se llama a este constructor. No se requieren permisos especiales para emitir el método dinámico.

Por ejemplo, un método dinámico que se crea con establecido para restrictedSkipVisibilitytrue puede acceder a un miembro privado de cualquier ensamblado de la pila de llamadas si se ha concedido acceso a miembros restringidos. Si el método dinámico se crea con código de confianza parcial en la pila de llamadas, no puede tener acceso a un miembro privado de un tipo en un ensamblado de .NET Framework, ya que estos ensamblados son de plena confianza.

Si restrictedSkipVisibility es false, se aplican las comprobaciones de visibilidad JIT. El código del método dinámico tiene acceso a métodos públicos de clases públicas y se producen excepciones si intenta acceder a tipos o miembros que son private, protectedo internal.

Cuando se construye un método dinámico hospedado de forma anónima, se incluye la pila de llamadas del ensamblado emisor. Cuando se invoca el método , se usan los permisos de la pila de llamadas emisoras en lugar de los permisos del llamador real. Por lo tanto, el método dinámico no puede ejecutarse en un nivel de privilegio mayor que el del ensamblado que lo emitió, incluso si se pasa a un ensamblado que tiene un nivel de confianza superior y lo ejecuta.

Este constructor especifica los atributos MethodAttributes.Public del método y MethodAttributes.Static, y la convención CallingConventions.Standardde llamada .

Note

Este constructor se introdujo en .NET Framework 3.5 o posterior.

Consulte también

Se aplica a

DynamicMethod(String, Type, Type[], Module)

Crea un método dinámico que es global para un módulo, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetro y el módulo.

public:
 DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Reflection::Module ^ m);
public DynamicMethod(string name, Type returnType, Type[] parameterTypes, System.Reflection.Module m);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * System.Reflection.Module -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), m As Module)

Parámetros

name
String

Nombre del método dinámico. Puede ser una cadena de longitud cero, pero no puede ser null.

returnType
Type

Objeto Type que especifica el tipo de valor devuelto del método dinámico o null si el método no tiene ningún tipo de valor devuelto.

parameterTypes
Type[]

Matriz de Type objetos que especifican los tipos de los parámetros del método dinámico o null si el método no tiene parámetros.

m
Module

que Module representa el módulo con el que se va a asociar lógicamente el método dinámico.

Excepciones

Un elemento de parameterTypes es null o Void.

O bien

m es un módulo que proporciona hospedaje anónimo para métodos dinámicos.

name es null.

O bien

m es null.

.NET Framework y .NET Core versiones anteriores a la 2.1: returnType es un tipo para el que IsByRef devuelve true.

Ejemplos

En el ejemplo de código siguiente se crea un método dinámico que toma dos parámetros. En el ejemplo se emite un cuerpo de función simple que imprime el primer parámetro en la consola y el ejemplo usa el segundo parámetro como valor devuelto del método. En el ejemplo se completa el método mediante la creación de un delegado, se invoca al delegado con parámetros diferentes y, por último, se invoca el método dinámico mediante el Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) método .

using System;
using System.Reflection;
using System.Reflection.Emit;
using Microsoft.VisualBasic;

public class Test
{
    // Declare a delegate that will be used to execute the completed
    // dynamic method.
    private delegate int HelloInvoker(string msg, int ret);

    public static void Main()
    {
        // Create an array that specifies the types of the parameters
        // of the dynamic method. This method has a string parameter
        // and an int parameter.
        Type[] helloArgs = {typeof(string), typeof(int)};

        // Create a dynamic method with the name "Hello", a return type
        // of int, and two parameters whose types are specified by the
        // array helloArgs. Create the method in the module that
        // defines the Test class.
        DynamicMethod hello = new DynamicMethod("Hello",
            typeof(int),
            helloArgs,
            typeof(Test).Module);

        // Create an array that specifies the parameter types of the
        // overload of Console.WriteLine to be used in Hello.
        Type[] writeStringArgs = {typeof(string)};
        // Get the overload of Console.WriteLine that has one
        // String parameter.
        MethodInfo writeString =
            typeof(Console).GetMethod("WriteLine", writeStringArgs);

        // Get an ILGenerator and emit a body for the dynamic method.
        ILGenerator il = hello.GetILGenerator();
        // Load the first argument, which is a string, onto the stack.
        il.Emit(OpCodes.Ldarg_0);
        // Call the overload of Console.WriteLine that prints a string.
        il.EmitCall(OpCodes.Call, writeString, null);
        // The Hello method returns the value of the second argument;
        // to do this, load the onto the stack and return.
        il.Emit(OpCodes.Ldarg_1);
        il.Emit(OpCodes.Ret);

        // Create a delegate that represents the dynamic method. This
        // action completes the method, and any further attempts to
        // change the method will cause an exception.
        HelloInvoker hi =
            (HelloInvoker) hello.CreateDelegate(typeof(HelloInvoker));

        // Use the delegate to execute the dynamic method. Save and
        // print the return value.
        int retval = hi("\r\nHello, World!", 42);
        Console.WriteLine("Executing delegate hi(\"Hello, World!\", 42) returned {0}",
            retval);

        // Do it again, with different arguments.
        retval = hi("\r\nHi, Mom!", 5280);
        Console.WriteLine("Executing delegate hi(\"Hi, Mom!\", 5280) returned {0}",
            retval);

        // Create an array of arguments to use with the Invoke method.
        object[] invokeArgs = {"\r\nHello, World!", 42};
        // Invoke the dynamic method using the arguments. This is much
        // slower than using the delegate, because you must create an
        // array to contain the arguments, and ValueType arguments
        // must be boxed.
        object objRet = hello.Invoke(null, invokeArgs);
        Console.WriteLine("hello.Invoke returned {0}", objRet);
    }
}
Imports System.Reflection
Imports System.Reflection.Emit

Public Class Test
    ' Declare a delegate that will be used to execute the completed
    ' dynamic method. 
    Private Delegate Function HelloInvoker(ByVal msg As String, _
        ByVal ret As Integer) As Integer

    Public Shared Sub Main()
        ' Create an array that specifies the types of the parameters
        ' of the dynamic method. This method has a String parameter
        ' and an Integer parameter.
        Dim helloArgs() As Type = {GetType(String), GetType(Integer)}

        ' Create a dynamic method with the name "Hello", a return type
        ' of Integer, and two parameters whose types are specified by
        ' the array helloArgs. Create the method in the module that
        ' defines the Test class.
        Dim hello As New DynamicMethod("Hello", _
            GetType(Integer), _
            helloArgs, _
            GetType(Test).Module)

        ' Create an array that specifies the parameter types of the
        ' overload of Console.WriteLine to be used in Hello.
        Dim writeStringArgs() As Type = {GetType(String)}
        ' Get the overload of Console.WriteLine that has one
        ' String parameter.
        Dim writeString As MethodInfo = GetType(Console). _
            GetMethod("WriteLine", writeStringArgs) 

        ' Get an ILGenerator and emit a body for the dynamic method.
        Dim il As ILGenerator = hello.GetILGenerator()
        ' Load the first argument, which is a string, onto the stack.
        il.Emit(OpCodes.Ldarg_0)
        ' Call the overload of Console.WriteLine that prints a string.
        il.EmitCall(OpCodes.Call, writeString, Nothing)
        ' The Hello method returns the value of the second argument;
        ' to do this, load the onto the stack and return.
        il.Emit(OpCodes.Ldarg_1)
        il.Emit(OpCodes.Ret)

        ' Create a delegate that represents the dynamic method. This
        ' action completes the method, and any further attempts to
        ' change the method will cause an exception.
    Dim hi As HelloInvoker = _
            hello.CreateDelegate(GetType(HelloInvoker))

        ' Use the delegate to execute the dynamic method. Save and
        ' print the return value.
        Dim retval As Integer = hi(vbCrLf & "Hello, World!", 42)
        Console.WriteLine("Executing delegate hi(""Hello, World!"", 42) returned " _
            & retval)

        ' Do it again, with different arguments.
        retval = hi(vbCrLf & "Hi, Mom!", 5280)
        Console.WriteLine("Executing delegate hi(""Hi, Mom!"", 5280) returned " _
            & retval)

        ' Create an array of arguments to use with the Invoke method.
        Dim invokeArgs() As Object = {vbCrLf & "Hello, World!", 42}
        ' Invoke the dynamic method using the arguments. This is much
        ' slower than using the delegate, because you must create an
        ' array to contain the arguments, and ValueType arguments
        ' must be boxed. Note that this overload of Invoke is 
        ' inherited from MethodBase, and simply calls the more 
        ' complete overload of Invoke.
        Dim objRet As Object = hello.Invoke(Nothing, invokeArgs)
        Console.WriteLine("hello.Invoke returned " & objRet)
    End Sub
End Class

' This code example produces the following output:
'
'Hello, World!
'Executing delegate hi("Hello, World!", 42) returned 42
'
'Hi, Mom!
'Executing delegate hi("Hi, Mom!", 5280) returned 5280
'
'Hello, World!
'hello.Invoke returned 42
'

Comentarios

Este constructor especifica atributos MethodAttributes.Public de método y MethodAttributes.Static, la convención CallingConventions.Standardde llamada y no omite las comprobaciones de visibilidad Just-In-Time (JIT).

El método dinámico creado con este constructor tiene acceso a miembros públicos y internal (Friend en Visual Basic) de todos los tipos contenidos en el módulo m.

Note

Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con la SecurityPermissionFlag.ControlEvidence bandera si se cumplen las siguientes condiciones: m es un módulo distinto del módulo que llama y ha fallado la demanda de ReflectionPermission con la ReflectionPermissionFlag.MemberAccess bandera. Si la demanda de SecurityPermission tiene éxito, se permite la operación.

Consulte también

Se aplica a

DynamicMethod(String, Type, Type[], Type)

Crea un método dinámico, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetro y el tipo con el que el método dinámico está asociado lógicamente.

public:
 DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, Type ^ owner);
public DynamicMethod(string name, Type returnType, Type[] parameterTypes, Type owner);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * Type -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), owner As Type)

Parámetros

name
String

Nombre del método dinámico. Puede ser una cadena de longitud cero, pero no puede ser null.

returnType
Type

Objeto Type que especifica el tipo de valor devuelto del método dinámico o null si el método no tiene ningún tipo de valor devuelto.

parameterTypes
Type[]

Matriz de Type objetos que especifican los tipos de los parámetros del método dinámico o null si el método no tiene parámetros.

owner
Type

objeto Type con el que el método dinámico está asociado lógicamente. El método dinámico tiene acceso a todos los miembros del tipo.

Excepciones

Un elemento de parameterTypes es null o Void.

O bien

owner es una interfaz, una matriz, un tipo genérico abierto o un parámetro de tipo de un tipo o método genéricos.

name es null.

O bien

owner es null.

.NET Framework y .NET Core versiones anteriores a la 2.1: returnType es un tipo para el que IsByRef devuelve true.

Ejemplos

En el ejemplo de código siguiente se crea un objeto DynamicMethod que está asociado lógicamente a un tipo . Esta asociación le da acceso a los miembros privados de ese tipo.

El ejemplo de código define una clase denominada Example con un campo privado, una clase denominada DerivedFromExample que deriva de la primera clase, un tipo delegado denominado UseLikeStatic que devuelve Int32 y tiene parámetros de tipo Example y Int32, y un tipo delegado denominado UseLikeInstance que devuelve Int32 y tiene un parámetro de tipo Int32.

A continuación, el código de ejemplo crea un DynamicMethod objeto que cambia el campo privado de una instancia de Example y devuelve el valor anterior.

Note

En general, cambiar los campos internos de las clases no es una buena práctica de codificación orientada a objetos.

El código de ejemplo crea una instancia de Example y, a continuación, crea dos delegados. La primera es de tipo UseLikeStatic, que tiene los mismos parámetros que el método dinámico. El segundo es de tipo UseLikeInstance, que carece del primer parámetro (de tipo Example). Este delegado se crea mediante la sobrecarga del método CreateDelegate(Type, Object); el segundo parámetro de esa sobrecarga de método es una instancia de Example, en este caso la instancia que acaba de crear, que está enlazado al delegado recién creado. Cada vez que se invoca ese delegado, el método dinámico actúa en la instancia enlazada de Example.

Note

Este es un ejemplo de las reglas relajadas para la vinculación de delegados introducidas en .NET Framework 2.0, junto con nuevas sobrecargas del método Delegate.CreateDelegate. Para obtener más información, vea la clase Delegate.

Se invoca al UseLikeStatic delegado y se pasa la instancia de Example que está enlazada al UseLikeInstance delegado. A continuación, se invoca al UseLikeInstance delegado, de modo que ambos delegados actúen sobre la misma instancia de Example. Los cambios en los valores del campo interno se muestran después de cada llamada. Por último, un UseLikeInstance delegado está enlazado a una instancia de DerivedFromExample y se repiten las llamadas de delegado.

using System;
using System.Reflection;
using System.Reflection.Emit;

// These classes are for demonstration purposes.
//
public class Example
{
    private int id = 0;
    public Example(int id)
    {
        this.id = id;
    }
    public int ID { get { return id; }}
}

public class DerivedFromExample : Example
{
    public DerivedFromExample(int id) : base(id) {}
}

// Two delegates are declared: UseLikeInstance treats the dynamic
// method as if it were an instance method, and UseLikeStatic
// treats the dynamic method in the ordinary fashion.
//
public delegate int UseLikeInstance(int newID);
public delegate int UseLikeStatic(Example ex, int newID);

public class Demo
{
    public static void Main()
    {
        // This dynamic method changes the private id field. It has
        // no name; it returns the old id value (return type int);
        // it takes two parameters, an instance of Example and
        // an int that is the new value of id; and it is declared
        // with Example as the owner type, so it can access all
        // members, public and private.
        //
        DynamicMethod changeID = new DynamicMethod(
            "",
            typeof(int),
            new Type[] { typeof(Example), typeof(int) },
            typeof(Example)
        );

        // Get a FieldInfo for the private field 'id'.
        FieldInfo fid = typeof(Example).GetField(
            "id",
            BindingFlags.NonPublic | BindingFlags.Instance
        );

        ILGenerator ilg = changeID.GetILGenerator();

        // Push the current value of the id field onto the
        // evaluation stack. It's an instance field, so load the
        // instance of Example before accessing the field.
        ilg.Emit(OpCodes.Ldarg_0);
        ilg.Emit(OpCodes.Ldfld, fid);

        // Load the instance of Example again, load the new value
        // of id, and store the new field value.
        ilg.Emit(OpCodes.Ldarg_0);
        ilg.Emit(OpCodes.Ldarg_1);
        ilg.Emit(OpCodes.Stfld, fid);

        // The original value of the id field is now the only
        // thing on the stack, so return from the call.
        ilg.Emit(OpCodes.Ret);

        // Create a delegate that uses changeID in the ordinary
        // way, as a static method that takes an instance of
        // Example and an int.
        //
        UseLikeStatic uls =
            (UseLikeStatic) changeID.CreateDelegate(
                typeof(UseLikeStatic)
            );

        // Create an instance of Example with an id of 42.
        //
        Example ex = new Example(42);

        // Create a delegate that is bound to the instance of
        // of Example. This is possible because the first
        // parameter of changeID is of type Example. The
        // delegate has all the parameters of changeID except
        // the first.
        UseLikeInstance uli =
            (UseLikeInstance) changeID.CreateDelegate(
                typeof(UseLikeInstance),
                ex
            );

        // First, change the value of id by calling changeID as
        // a static method, passing in the instance of Example.
        //
        Console.WriteLine(
            "Change the value of id; previous value: {0}",
            uls(ex, 1492)
        );

        // Change the value of id again using the delegate bound
        // to the instance of Example.
        //
        Console.WriteLine(
            "Change the value of id; previous value: {0}",
            uli(2700)
        );

        Console.WriteLine("Final value of id: {0}", ex.ID);

        // Now repeat the process with a class that derives
        // from Example.
        //
        DerivedFromExample dfex = new DerivedFromExample(71);

        uli = (UseLikeInstance) changeID.CreateDelegate(
                typeof(UseLikeInstance),
                dfex
            );

        Console.WriteLine(
            "Change the value of id; previous value: {0}",
            uls(dfex, 73)
        );
        Console.WriteLine(
            "Change the value of id; previous value: {0}",
            uli(79)
        );
        Console.WriteLine("Final value of id: {0}", dfex.ID);
    }
}

/* This code example produces the following output:

Change the value of id; previous value: 42
Change the value of id; previous value: 1492
Final value of id: 2700
Change the value of id; previous value: 71
Change the value of id; previous value: 73
Final value of id: 79
 */
Imports System.Reflection
Imports System.Reflection.Emit

' These classes are for demonstration purposes.
'
Public Class Example
    Private _id As Integer = 0
    
    Public Sub New(ByVal newId As Integer) 
        _id = newId    
    End Sub
    
    Public ReadOnly Property ID() As Integer 
        Get
            Return _id
        End Get
    End Property 
End Class

Public Class DerivedFromExample
    Inherits Example
    
    Public Sub New(ByVal newId As Integer) 
        MyBase.New(newId)
    End Sub
End Class
 
' Two delegates are declared: UseLikeInstance treats the dynamic
' method as if it were an instance method, and UseLikeStatic
' treats the dynamic method in the ordinary fashion.
' 
Public Delegate Function UseLikeInstance(ByVal newID As Integer) _
    As Integer 
Public Delegate Function UseLikeStatic(ByVal ex As Example, _
    ByVal newID As Integer) As Integer 

Public Class Demo
    
    Public Shared Sub Main() 
        ' This dynamic method changes the private _id field. It 
        ' has no name; it returns the old _id value (return type 
        ' Integer); it takes two parameters, an instance of Example 
        ' and an Integer that is the new value of _id; and it is 
        ' declared with Example as the owner type, so it can 
        ' access all members, public and private.
        '
        Dim changeID As New DynamicMethod( _
            "", _
            GetType(Integer), _
            New Type() {GetType(Example), GetType(Integer)}, _
            GetType(Example) _
        )
        
        ' Get a FieldInfo for the private field '_id'.
        Dim fid As FieldInfo = GetType(Example).GetField( _
            "_id", _
            BindingFlags.NonPublic Or BindingFlags.Instance _
        )
        
        Dim ilg As ILGenerator = changeID.GetILGenerator()
        
        ' Push the current value of the id field onto the 
        ' evaluation stack. It's an instance field, so load the
        ' instance of Example before accessing the field.
        ilg.Emit(OpCodes.Ldarg_0)
        ilg.Emit(OpCodes.Ldfld, fid)
        
        ' Load the instance of Example again, load the new value 
        ' of id, and store the new field value. 
        ilg.Emit(OpCodes.Ldarg_0)
        ilg.Emit(OpCodes.Ldarg_1)
        ilg.Emit(OpCodes.Stfld, fid)
        
        ' The original value of the id field is now the only 
        ' thing on the stack, so return from the call.
        ilg.Emit(OpCodes.Ret)
        
        
        ' Create a delegate that uses changeID in the ordinary
        ' way, as a static method that takes an instance of
        ' Example and an Integer.
        '
        Dim uls As UseLikeStatic = CType( _
            changeID.CreateDelegate(GetType(UseLikeStatic)), _
            UseLikeStatic _
        )
        
        ' Create an instance of Example with an id of 42.
        '
        Dim ex As New Example(42)
        
        ' Create a delegate that is bound to the instance of 
        ' of Example. This is possible because the first 
        ' parameter of changeID is of type Example. The 
        ' delegate has all the parameters of changeID except
        ' the first.
        Dim uli As UseLikeInstance = CType( _
            changeID.CreateDelegate( _
                GetType(UseLikeInstance), _
                ex), _
            UseLikeInstance _
        )
        
        ' First, change the value of _id by calling changeID as
        ' a static method, passing in the instance of Example.
        '
        Console.WriteLine( _
            "Change the value of _id; previous value: {0}", _
            uls(ex, 1492) _
        )
        
        ' Change the value of _id again using the delegate 
        ' bound to the instance of Example.
        '
        Console.WriteLine( _
            "Change the value of _id; previous value: {0}", _
            uli(2700) _
        )
        
        Console.WriteLine("Final value of _id: {0}", ex.ID)
    

        ' Now repeat the process with a class that derives
        ' from Example.
        '
        Dim dfex As New DerivedFromExample(71)

        uli = CType( _
            changeID.CreateDelegate( _
                GetType(UseLikeInstance), _
                dfex), _
            UseLikeInstance _
        )

        Console.WriteLine( _
            "Change the value of _id; previous value: {0}", _
            uls(dfex, 73) _
        )
        Console.WriteLine( _
            "Change the value of _id; previous value: {0}", _
            uli(79) _
        )
        Console.WriteLine("Final value of _id: {0}", dfex.ID)

    End Sub
End Class

' This code example produces the following output:
'
'Change the value of _id; previous value: 42
'Change the value of _id; previous value: 1492
'Final value of _id: 2700
'Change the value of _id; previous value: 71
'Change the value of _id; previous value: 73
'Final value of _id: 79'

Comentarios

El método dinámico creado con este constructor tiene acceso a todos los miembros del tipo owner, y a los miembros públicos y internal (Friend en Visual Basic) de todos los demás tipos del módulo que contiene owner.

Este constructor especifica atributos MethodAttributes.Public de método y MethodAttributes.Static, la convención CallingConventions.Standardde llamada y no omite las comprobaciones de visibilidad Just-In-Time (JIT).

Note

Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con el indicador SecurityPermissionFlag.ControlEvidence si se cumplen ambas condiciones: owner está en un módulo diferente al módulo que realiza la llamada, y la solicitud de ReflectionPermission con el indicador ReflectionPermissionFlag.MemberAccess ha fallado. Si la demanda de SecurityPermission tiene éxito, se permite la operación.

Consulte también

Se aplica a

DynamicMethod(String, Type, Type[], Module, Boolean)

Crea un método dinámico global para un módulo, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetros, el módulo y si las comprobaciones de visibilidad Just-In-Time (JIT) deben omitirse para los tipos y miembros a Microsoft los que tiene acceso el lenguaje intermedio (MSIL) del método dinámico.

public:
 DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Reflection::Module ^ m, bool skipVisibility);
public DynamicMethod(string name, Type returnType, Type[] parameterTypes, System.Reflection.Module m, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * System.Reflection.Module * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), m As Module, skipVisibility As Boolean)

Parámetros

name
String

Nombre del método dinámico. Puede ser una cadena de longitud cero, pero no puede ser null.

returnType
Type

Objeto Type que especifica el tipo de valor devuelto del método dinámico o null si el método no tiene ningún tipo de valor devuelto.

parameterTypes
Type[]

Matriz de Type objetos que especifican los tipos de los parámetros del método dinámico o null si el método no tiene parámetros.

m
Module

que Module representa el módulo con el que se va a asociar lógicamente el método dinámico.

skipVisibility
Boolean

true para omitir las comprobaciones de visibilidad JIT en los tipos y miembros a los que accede el MSIL del método dinámico.

Excepciones

Un elemento de parameterTypes es null o Void.

O bien

m es un módulo que proporciona hospedaje anónimo para métodos dinámicos.

name es null.

O bien

m es null.

.NET Framework y .NET Core versiones anteriores a la 2.1: returnType es un tipo para el que IsByRef devuelve true.

Comentarios

Este constructor especifica atributos MethodAttributes.Public de método y MethodAttributes.Static, y la convención CallingConventions.Standardde llamada a .

El método dinámico creado con este constructor tiene acceso a miembros públicos y internal (Friend en Visual Basic) de todos los tipos del módulo contenido m. Omitir las comprobaciones de visibilidad del compilador JIT permite que el método dinámico acceda también a miembros privados y protegidos de todos los demás tipos. Esto es útil, por ejemplo, al escribir código para serializar objetos.

Note

Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con la SecurityPermissionFlag.ControlEvidence bandera si se cumplen las siguientes condiciones: m es un módulo distinto del módulo que llama y ha fallado la demanda de ReflectionPermission con la ReflectionPermissionFlag.MemberAccess bandera. Si la demanda de SecurityPermission tiene éxito, se permite la operación.

Consulte también

Se aplica a

DynamicMethod(String, Type, Type[], Type, Boolean)

Crea un método dinámico, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetros, el tipo con el que está asociado lógicamente el método dinámico y si las comprobaciones de visibilidad Just-In-Time (JIT) deben omitirse para los tipos y miembros a Microsoft los que accede el lenguaje intermedio (MSIL) del método dinámico.

public:
 DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, Type ^ owner, bool skipVisibility);
public DynamicMethod(string name, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * Type * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), owner As Type, skipVisibility As Boolean)

Parámetros

name
String

Nombre del método dinámico. Puede ser una cadena de longitud cero, pero no puede ser null.

returnType
Type

Objeto Type que especifica el tipo de valor devuelto del método dinámico o null si el método no tiene ningún tipo de valor devuelto.

parameterTypes
Type[]

Matriz de Type objetos que especifican los tipos de los parámetros del método dinámico o null si el método no tiene parámetros.

owner
Type

objeto Type con el que el método dinámico está asociado lógicamente. El método dinámico tiene acceso a todos los miembros del tipo.

skipVisibility
Boolean

true para omitir comprobaciones de visibilidad JIT en tipos y miembros a los que accede el MSIL del método dinámico; de lo contrario, false.

Excepciones

Un elemento de parameterTypes es null o Void.

O bien

owner es una interfaz, una matriz, un tipo genérico abierto o un parámetro de tipo de un tipo o método genéricos.

name es null.

O bien

owner es null.

.NET Framework y .NET Core versiones anteriores a la 2.1: returnType es un tipo para el que IsByRef devuelve true.

Comentarios

El método dinámico creado con este constructor tiene acceso a todos los miembros del tipo owner, y a los miembros públicos y internal (Friend en Visual Basic) de todos los demás tipos del módulo que contiene owner. Omitir las comprobaciones de visibilidad del compilador JIT permite que el método dinámico acceda también a miembros privados y protegidos de todos los demás tipos. Esto es útil, por ejemplo, al escribir código para serializar objetos.

Este constructor especifica atributos MethodAttributes.Public de método y MethodAttributes.Static, y la convención CallingConventions.Standardde llamada a .

Note

Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con el indicador SecurityPermissionFlag.ControlEvidence si se cumplen ambas condiciones: owner está en un módulo diferente al módulo que realiza la llamada, y la solicitud de ReflectionPermission con el indicador ReflectionPermissionFlag.MemberAccess ha fallado. Si la demanda de SecurityPermission tiene éxito, se permite la operación.

Consulte también

Se aplica a

DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Module, Boolean)

Crea un método dinámico global para un módulo, especificando el nombre del método, los atributos, la convención de llamada, el tipo de valor devuelto, los tipos de parámetros, el módulo y si las comprobaciones de visibilidad Just-In-Time (JIT) deben omitirse para los tipos y miembros a los que accede el lenguaje intermedio (MSIL) de Microsoft del método dinámico.

public:
 DynamicMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Reflection::Module ^ m, bool skipVisibility);
public DynamicMethod(string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes, System.Reflection.Module m, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * System.Reflection.Module * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, parameterTypes As Type(), m As Module, skipVisibility As Boolean)

Parámetros

name
String

Nombre del método dinámico. Puede ser una cadena de longitud cero, pero no puede ser null.

attributes
MethodAttributes

Combinación bit a bit de MethodAttributes valores que especifica los atributos del método dinámico. La única combinación permitida es Public y Static.

callingConvention
CallingConventions

Convención de llamada para el método dinámico. Debe ser Standard.

returnType
Type

Objeto Type que especifica el tipo de valor devuelto del método dinámico o null si el método no tiene ningún tipo de valor devuelto.

parameterTypes
Type[]

Matriz de Type objetos que especifican los tipos de los parámetros del método dinámico o null si el método no tiene parámetros.

m
Module

que Module representa el módulo con el que se va a asociar lógicamente el método dinámico.

skipVisibility
Boolean

true para omitir comprobaciones de visibilidad JIT en tipos y miembros a los que accede el MSIL del método dinámico; de lo contrario, false.

Excepciones

Un elemento de parameterTypes es null o Void.

O bien

m es un módulo que proporciona hospedaje anónimo para métodos dinámicos.

name es null.

O bien

m es null.

attributes es una combinación de marcas distintas Public de y Static.

O bien

callingConvention no Standardes .

O bien

returnType es un tipo para el que IsByRef devuelve true.

Comentarios

El método dinámico creado con este constructor tiene acceso a los miembros públicos y internal (Friend en Visual Basic) de todos los tipos públicos e internos contenidos en el módulo m.

Omitir las comprobaciones de visibilidad del compilador JIT permite que el método dinámico acceda también a miembros privados y protegidos de todos los demás tipos del módulo y en todos los demás ensamblados. Esto es útil, por ejemplo, al escribir código para serializar objetos.

Note

Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con la SecurityPermissionFlag.ControlEvidence bandera si se cumplen las siguientes condiciones: m es un módulo distinto del módulo que llama y ha fallado la demanda de ReflectionPermission con la ReflectionPermissionFlag.MemberAccess bandera. Si la demanda de SecurityPermission tiene éxito, se permite la operación.

Consulte también

Se aplica a

DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type, Boolean)

Crea un método dinámico, especificando el nombre del método, los atributos, la convención de llamada, el tipo de valor devuelto, los tipos de parámetros, el tipo con el que está asociado lógicamente el método dinámico y si las comprobaciones de visibilidad Just-In-Time (JIT) deben omitirse para los tipos y miembros a Microsoft los que accede el lenguaje intermedio (MSIL) del método dinámico.

public:
 DynamicMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, Type ^ owner, bool skipVisibility);
public DynamicMethod(string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * Type * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, parameterTypes As Type(), owner As Type, skipVisibility As Boolean)

Parámetros

name
String

Nombre del método dinámico. Puede ser una cadena de longitud cero, pero no puede ser null.

attributes
MethodAttributes

Combinación bit a bit de MethodAttributes valores que especifica los atributos del método dinámico. La única combinación permitida es Public y Static.

callingConvention
CallingConventions

Convención de llamada para el método dinámico. Debe ser Standard.

returnType
Type

Objeto Type que especifica el tipo de valor devuelto del método dinámico o null si el método no tiene ningún tipo de valor devuelto.

parameterTypes
Type[]

Matriz de Type objetos que especifican los tipos de los parámetros del método dinámico o null si el método no tiene parámetros.

owner
Type

objeto Type con el que el método dinámico está asociado lógicamente. El método dinámico tiene acceso a todos los miembros del tipo.

skipVisibility
Boolean

true para omitir comprobaciones de visibilidad JIT en tipos y miembros a los que accede el MSIL del método dinámico; de lo contrario, false.

Excepciones

Un elemento de parameterTypes es null o Void.

O bien

owner es una interfaz, una matriz, un tipo genérico abierto o un parámetro de tipo de un tipo o método genéricos.

name es null.

O bien

owner es null.

attributes es una combinación de marcas distintas Public de y Static.

O bien

callingConvention no Standardes .

O bien

returnType es un tipo para el que IsByRef devuelve true.

Comentarios

El método dinámico es global para el módulo que contiene el tipo owner. Tiene acceso a todos los miembros del tipo owner.

El método dinámico creado con este constructor tiene acceso a todos los miembros del tipo owner, y a los miembros públicos y internal (Friend en Visual Basic) miembros de todos los tipos contenidos en el módulo que contiene owner. Omitir las comprobaciones de visibilidad del compilador JIT permite que el método dinámico acceda también a miembros privados y protegidos de todos los demás tipos. Esto es útil, por ejemplo, al escribir código para serializar objetos.

Note

Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con el indicador SecurityPermissionFlag.ControlEvidence si se cumplen ambas condiciones: owner está en un módulo diferente al módulo que realiza la llamada, y la solicitud de ReflectionPermission con el indicador ReflectionPermissionFlag.MemberAccess ha fallado. Si la demanda de SecurityPermission tiene éxito, se permite la operación.

Consulte también

Se aplica a