DynamicMethod Construtores

Definição

Cria um método dinâmico.

Sobrecargas

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

Inicializa um método dinâmico hospedado anonimamente, especificando o nome do método, o tipo de retorno e os tipos de parâmetros.

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

Inicializa um método dinâmico alojado anonimamente, especificando o nome do método, tipo de retorno, tipos de parâmetros e se as verificações de visibilidade just-in-time (JIT) devem ser ignoradas para tipos e membros acedidos pela linguagem intermédia Microsoft (MSIL) do método dinâmico.

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

Cria um método dinâmico que é global para um módulo, especificando o nome do método, tipo de retorno, tipos de parâmetros e módulo.

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

Cria um método dinâmico, especificando o nome do método, tipo de retorno, tipos de parâmetros e o tipo com que o método dinâmico está logicamente associado.

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

Cria um método dinâmico que é global para um módulo, especificando o nome do método, tipo de retorno, tipos de parâmetro, módulo e se as verificações de visibilidade just-in-time (JIT) devem ser ignoradas para tipos e membros acedidos pela linguagem intermédia Microsoft (MSIL) do método dinâmico.

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

Cria um método dinâmico, especificando o nome do método, tipo de retorno, tipos de parâmetro, o tipo com que o método dinâmico está logicamente associado e se as verificações de visibilidade just-in-time (JIT) devem ser ignoradas para tipos e membros acedidos pela linguagem intermédia Microsoft (MSIL) do método dinâmico.

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

Cria um método dinâmico que é global para um módulo, especificando o nome do método, atributos, convenção de chamada, tipo de retorno, tipos de parâmetros, módulo e se as verificações de visibilidade just-in-time (JIT) devem ser ignoradas para tipos e membros acedidos pela linguagem intermédia Microsoft (MSIL) do método dinâmico.

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

Cria um método dinâmico, especificando o nome do método, atributos, convenção de chamada, tipo de retorno, tipos de parâmetro, o tipo com que o método dinâmico está logicamente associado e se as verificações de visibilidade just-in-time (JIT) devem ser ignoradas para tipos e membros acedidos pela linguagem intermédia Microsoft (MSIL) do método dinâmico.

DynamicMethod(String, Type, Type[])

Inicializa um método dinâmico hospedado anonimamente, especificando o nome do método, o tipo de retorno e os tipos de parâmetros.

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

O nome do método dinâmico. Isto pode ser uma corda de comprimento zero, mas não pode ser null.

returnType
Type

Um objeto que especifica o tipo de retorno do método dinâmico, ou null se o método não tiver tipo de Type retorno.

parameterTypes
Type[]

Um array de Type objetos que especifica os tipos dos parâmetros do método dinâmico, ou null se o método não tiver parâmetros.

Exceções

Um elemento de parameterTypes é null ou Void.

name é null.

.NET Framework e versões .NET Core anteriores à 2.1: returnType é um tipo para o qual IsByRef devolve true.

Observações

O método dinâmico criado por este construtor está associado a um conjunto anónimo em vez de um tipo ou módulo existente. A assembly anónima existe apenas para fornecer um ambiente sandbox para métodos dinâmicos, ou seja, para os isolar de outro código. Este ambiente torna seguro que o método dinâmico seja emitido e executado por código parcialmente confiável.

Este construtor especifica que verificações de visibilidade just-in-time (JIT) serão aplicadas para a linguagem intermédia Microsoft (MSIL) do método dinâmico. Ou seja, o código no método dinâmico tem acesso aos métodos públicos das classes públicas. Exceções são lançadas se o método tentar aceder a tipos ou membros que sejam private, protected ou internal (Friend em Visual Basic). Para criar um método dinâmico que tenha capacidade restrita de saltar verificações de visibilidade JIT, use o DynamicMethod(String, Type, Type[], Boolean) construtor.

Quando um método dinâmico hospedado anonimamente é construído, a pilha de chamadas do conjunto emissor é incluída. Quando o método é invocado, as permissões do conjunto emissor são usadas em vez das permissões do chamador real. Assim, o método dinâmico não pode ser executado a um nível de privilégio superior ao do assembly que o emitiu, mesmo que seja passado e executado por um assembly com um nível de confiança mais elevado.

Este construtor especifica os atributos MethodAttributes.Public do método e MethodAttributes.Static, e a convenção CallingConventions.Standardde chamada .

Note

Este construtor foi introduzido no .NET Framework 3.5 ou posterior.

Ver também

Aplica-se a

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

Inicializa um método dinâmico alojado anonimamente, especificando o nome do método, tipo de retorno, tipos de parâmetros e se as verificações de visibilidade just-in-time (JIT) devem ser ignoradas para tipos e membros acedidos pela linguagem intermédia Microsoft (MSIL) do 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

O nome do método dinâmico. Isto pode ser uma corda de comprimento zero, mas não pode ser null.

returnType
Type

Um objeto que especifica o tipo de retorno do método dinâmico, ou null se o método não tiver tipo de Type retorno.

parameterTypes
Type[]

Um array de Type objetos que especifica os tipos dos parâmetros do método dinâmico, ou null se o método não tiver parâmetros.

restrictedSkipVisibility
Boolean

true para evitar as verificações de visibilidade JIT nos tipos e membros acedidos pelo MSIL do método dinâmico, com esta restrição: o nível de confiança dos assemblies que contêm esses tipos e membros deve ser igual ou inferior ao nível de confiança da pilha de chamadas que emite o método dinâmico; caso contrário, false.

Exceções

Um elemento de parameterTypes é null ou Void.

name é null.

.NET Framework e versões .NET Core anteriores à 2.1: returnType é um tipo para o qual IsByRef devolve true.

Observações

O método dinâmico criado por este construtor está associado a um conjunto anónimo em vez de um tipo ou módulo existente. A assembly anónima existe apenas para fornecer um ambiente sandbox para métodos dinâmicos, ou seja, para os isolar de outro código. Este ambiente torna seguro que o método dinâmico seja emitido e executado por código parcialmente confiável.

Métodos dinâmicos alojados anonimamente não têm acesso automático a quaisquer tipos ou membros que sejam private, protected ou internal (Friend em Visual Basic). Isto é diferente dos métodos dinâmicos associados a um tipo ou módulo existente, que têm acesso a membros ocultos no seu âmbito associado.

Especifique true para restrictedSkipVisibility se o seu método dinâmico tem de aceder a tipos ou membros que sejam private, protected, ou internal. Isto restringe o acesso ao método dinâmico a estes membros. Ou seja, os membros só podem ser acedidos se forem cumpridas as seguintes condições:

  • Os membros-alvo pertencem a um assembly que tem um nível de confiança igual ou inferior ao da pilha de chamadas que emite o método dinâmico.

  • A pilha de chamadas que emite o método dinâmico é atribuído ReflectionPermission com a ReflectionPermissionFlag.RestrictedMemberAccess flag. Isto é sempre verdade quando o código é executado com total confiança. Para código parcialmente confiável, só é verdade se o host conceder explicitamente a permissão.

    Importante

    Se a permissão não for concedida, é lançada uma exceção de segurança quando CreateDelegate é chamada ou quando o método dinâmico é invocado, não quando este construtor é chamado. Não são necessárias permissões especiais para emitir o método dinâmico.

Por exemplo, um método dinâmico criado com restrictedSkipVisibility definido para true pode aceder a um membro privado de qualquer assembly na pilha de chamadas se a pilha de chamadas tiver recebido acesso restrito ao membro. Se o método dinâmico for criado com código parcialmente confiável na pilha de chamadas, não pode aceder a um membro privado de um tipo numa assembly .NET Framework, porque tais assemblies são totalmente confiáveis.

Se restrictedSkipVisibility for false, as verificações de visibilidade do JIT são aplicadas. O código no método dinâmico tem acesso a métodos públicos de classes públicas, e exceções são lançadas se tentar aceder a tipos ou membros que sejam private, protected, ou internal.

Quando um método dinâmico hospedado anonimamente é construído, a pilha de chamadas do conjunto emissor é incluída. Quando o método é invocado, as permissões da pilha de chamadas de emissão são usadas em vez das permissões do chamador atual. Assim, o método dinâmico não pode ser executado a um nível de privilégio superior ao do assembly que o emitiu, mesmo que seja passado e executado por um assembly com um nível de confiança mais elevado.

Este construtor especifica os atributos MethodAttributes.Public do método e MethodAttributes.Static, e a convenção CallingConventions.Standardde chamada .

Note

Este construtor foi introduzido no .NET Framework 3.5 ou posterior.

Ver também

Aplica-se a

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

Cria um método dinâmico que é global para um módulo, especificando o nome do método, tipo de retorno, tipos de parâmetros e 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

O nome do método dinâmico. Isto pode ser uma corda de comprimento zero, mas não pode ser null.

returnType
Type

Um objeto que especifica o tipo de retorno do método dinâmico, ou null se o método não tiver tipo de Type retorno.

parameterTypes
Type[]

Um array de Type objetos que especifica os tipos dos parâmetros do método dinâmico, ou null se o método não tiver parâmetros.

m
Module

A Module representa o módulo com o qual o método dinâmico deve ser logicamente associado.

Exceções

Um elemento de parameterTypes é null ou Void.

-ou-

m é um módulo que fornece alojamento anónimo para métodos dinâmicos.

name é null.

-ou-

m é null.

.NET Framework e versões .NET Core anteriores à 2.1: returnType é um tipo para o qual IsByRef devolve true.

Exemplos

O exemplo de código seguinte cria um método dinâmico que assume dois parâmetros. O exemplo emite um corpo de função simples que imprime o primeiro parâmetro na consola, e o exemplo usa o segundo parâmetro como valor de retorno do método. O exemplo completa o método criando um delegado, invoca o delegado com diferentes parâmetros e, finalmente, invoca o método dinâmico usando o 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
'

Observações

Este construtor especifica os atributos MethodAttributes.Public do método e MethodAttributes.Static, chamando a convenção CallingConventions.Standard, e não omite verificações de visibilidade just-in-time (JIT).

O método dinâmico criado com este construtor tem acesso a membros públicos e internal (Friend no Visual Basic) de todos os tipos contidos no módulo m.

Note

Para compatibilidade retroativa, este construtor exige SecurityPermission com o sinalizador SecurityPermissionFlag.ControlEvidence se as seguintes condições ambas se verificarem: m é um módulo diferente do módulo chamador, e a exigência de ReflectionPermission com o sinalizador ReflectionPermissionFlag.MemberAccess falhou. Se a solicitação SecurityPermission for bem-sucedida, a operação é permitida.

Ver também

Aplica-se a

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

Cria um método dinâmico, especificando o nome do método, tipo de retorno, tipos de parâmetros e o tipo com que o método dinâmico está logicamente associado.

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

O nome do método dinâmico. Isto pode ser uma corda de comprimento zero, mas não pode ser null.

returnType
Type

Um objeto que especifica o tipo de retorno do método dinâmico, ou null se o método não tiver tipo de Type retorno.

parameterTypes
Type[]

Um array de Type objetos que especifica os tipos dos parâmetros do método dinâmico, ou null se o método não tiver parâmetros.

owner
Type

A Type com o qual o método dinâmico está logicamente associado. O método dinâmico tem acesso a todos os membros do tipo.

Exceções

Um elemento de parameterTypes é null ou Void.

-ou-

owner é uma interface, um array, um tipo genérico aberto, ou um parâmetro de tipo de um tipo ou método genérico.

name é null.

-ou-

owner é null.

.NET Framework e versões .NET Core anteriores à 2.1: returnType é um tipo para o qual IsByRef devolve true.

Exemplos

O seguinte exemplo de código cria um DynamicMethod que está logicamente associado a um tipo. Esta associação dá-lhe acesso a membros privados desse tipo.

O exemplo de código define uma classe nomeada Example com um campo privado, uma classe nomeada DerivedFromExample que deriva da primeira classe, um tipo delegado chamado UseLikeStatic que devolve Int32 e tem parâmetros do tipo Example e Int32, e um tipo delegado chamado UseLikeInstance que devolve Int32 e tem um parâmetro do tipo Int32.

O código de exemplo cria então um DynamicMethod que altera o campo privado de uma instância de Example e devolve o valor anterior.

Note

Em geral, mudar os campos internos das classes não é uma boa prática de programação orientada a objetos.

O código de exemplo cria uma instância de Example e depois cria dois delegados. O primeiro é do tipo UseLikeStatic, que tem os mesmos parâmetros do método dinâmico. O segundo é do tipo UseLikeInstance, que não possui o primeiro parâmetro (do tipo Example). Este delegado é criado usando a CreateDelegate(Type, Object) sobrecarga de métodos; o segundo parâmetro dessa sobrecarga de método é uma instância de Example, neste caso a instância acabada de criar, que está ligada ao delegado recém-criado. Sempre que esse delegado é invocado, o método dinâmico atua sobre a instância ligada de Example.

Note

Este é um exemplo das regras relaxadas para ligação de delegados introduzidas no .NET Framework 2.0, juntamente com novas sobrecargas do método Delegate.CreateDelegate. Para obter mais informações, consulte a classe Delegate.

O UseLikeStatic delegado é invocado, passando a instância de Example que está vinculado ao UseLikeInstance delegado. Então invoca-se o UseLikeInstance delegado, de modo que ambos os delegados atuem na mesma instância de Example. As alterações nos valores do campo interno são apresentadas após cada chamada. Finalmente, um UseLikeInstance delegado está ligado a uma instância de DerivedFromExample, e as chamadas de delegado são repetidas.

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'

Observações

O método dinâmico criado com este construtor tem acesso a todos os membros do tipo owner, e aos membros públicos e internal (Friend no Visual Basic ) de todos os outros tipos no módulo que contém owner.

Este construtor especifica os atributos MethodAttributes.Public do método e MethodAttributes.Static, chamando a convenção CallingConventions.Standard, e não omite verificações de visibilidade just-in-time (JIT).

Note

Para compatibilidade retroativa, este construtor exige SecurityPermission com a SecurityPermissionFlag.ControlEvidence flag se ambas as seguintes condições forem verdadeiras: owner está num módulo diferente daquele que faz a chamada, e a exigência de ReflectionPermission com a ReflectionPermissionFlag.MemberAccess flag falhou. Se a solicitação SecurityPermission for bem-sucedida, a operação é permitida.

Ver também

Aplica-se a

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

Cria um método dinâmico que é global para um módulo, especificando o nome do método, tipo de retorno, tipos de parâmetro, módulo e se as verificações de visibilidade just-in-time (JIT) devem ser ignoradas para tipos e membros acedidos pela linguagem intermédia Microsoft (MSIL) do 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

O nome do método dinâmico. Isto pode ser uma corda de comprimento zero, mas não pode ser null.

returnType
Type

Um objeto que especifica o tipo de retorno do método dinâmico, ou null se o método não tiver tipo de Type retorno.

parameterTypes
Type[]

Um array de Type objetos que especifica os tipos dos parâmetros do método dinâmico, ou null se o método não tiver parâmetros.

m
Module

A Module representa o módulo com o qual o método dinâmico deve ser logicamente associado.

skipVisibility
Boolean

true para evitar verificações de visibilidade JIT em tipos e membros acedidos pelo MSIL do método dinâmico.

Exceções

Um elemento de parameterTypes é null ou Void.

-ou-

m é um módulo que fornece alojamento anónimo para métodos dinâmicos.

name é null.

-ou-

m é null.

.NET Framework e versões .NET Core anteriores à 2.1: returnType é um tipo para o qual IsByRef devolve true.

Observações

Este construtor especifica os atributos MethodAttributes.Public do método e MethodAttributes.Static, e a convenção CallingConventions.Standardde chamada .

O método dinâmico criado com este construtor tem acesso a membros públicos e internal (Friend em Visual Basic) de todos os tipos no módulo contido m. Ignorar as verificações de visibilidade do compilador JIT permite que o método dinâmico aceda a membros privados e protegidos de todos os outros tipos também. Isto é útil, por exemplo, ao escrever código para serializar objetos.

Note

Para compatibilidade retroativa, este construtor exige SecurityPermission com o sinalizador SecurityPermissionFlag.ControlEvidence se as seguintes condições ambas se verificarem: m é um módulo diferente do módulo chamador, e a exigência de ReflectionPermission com o sinalizador ReflectionPermissionFlag.MemberAccess falhou. Se a solicitação SecurityPermission for bem-sucedida, a operação é permitida.

Ver também

Aplica-se a

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

Cria um método dinâmico, especificando o nome do método, tipo de retorno, tipos de parâmetro, o tipo com que o método dinâmico está logicamente associado e se as verificações de visibilidade just-in-time (JIT) devem ser ignoradas para tipos e membros acedidos pela linguagem intermédia Microsoft (MSIL) do 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

O nome do método dinâmico. Isto pode ser uma corda de comprimento zero, mas não pode ser null.

returnType
Type

Um objeto que especifica o tipo de retorno do método dinâmico, ou null se o método não tiver tipo de Type retorno.

parameterTypes
Type[]

Um array de Type objetos que especifica os tipos dos parâmetros do método dinâmico, ou null se o método não tiver parâmetros.

owner
Type

A Type com o qual o método dinâmico está logicamente associado. O método dinâmico tem acesso a todos os membros do tipo.

skipVisibility
Boolean

true para evitar verificações de visibilidade JIT sobre tipos e membros acedidos pelo MSIL do método dinâmico; caso contrário, false.

Exceções

Um elemento de parameterTypes é null ou Void.

-ou-

owner é uma interface, um array, um tipo genérico aberto, ou um parâmetro de tipo de um tipo ou método genérico.

name é null.

-ou-

owner é null.

.NET Framework e versões .NET Core anteriores à 2.1: returnType é um tipo para o qual IsByRef devolve true.

Observações

O método dinâmico criado com este construtor tem acesso a todos os membros do tipo owner, e aos membros públicos e internal (Friend no Visual Basic ) de todos os outros tipos no módulo que contém owner. Ignorar as verificações de visibilidade do compilador JIT permite que o método dinâmico aceda a membros privados e protegidos de todos os outros tipos também. Isto é útil, por exemplo, ao escrever código para serializar objetos.

Este construtor especifica os atributos MethodAttributes.Public do método e MethodAttributes.Static, e a convenção CallingConventions.Standardde chamada .

Note

Para compatibilidade retroativa, este construtor exige SecurityPermission com a SecurityPermissionFlag.ControlEvidence flag se ambas as seguintes condições forem verdadeiras: owner está num módulo diferente daquele que faz a chamada, e a exigência de ReflectionPermission com a ReflectionPermissionFlag.MemberAccess flag falhou. Se a solicitação SecurityPermission for bem-sucedida, a operação é permitida.

Ver também

Aplica-se a

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

Cria um método dinâmico que é global para um módulo, especificando o nome do método, atributos, convenção de chamada, tipo de retorno, tipos de parâmetros, módulo e se as verificações de visibilidade just-in-time (JIT) devem ser ignoradas para tipos e membros acedidos pela linguagem intermédia Microsoft (MSIL) do 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

O nome do método dinâmico. Isto pode ser uma corda de comprimento zero, mas não pode ser null.

attributes
MethodAttributes

Uma combinação bit a bit de MethodAttributes valores que especifica os atributos do método dinâmico. A única combinação permitida é Public e Static.

callingConvention
CallingConventions

A convenção de chamada para o método dinâmico. Deve ser Standard.

returnType
Type

Um objeto que especifica o tipo de retorno do método dinâmico, ou null se o método não tiver tipo de Type retorno.

parameterTypes
Type[]

Um array de Type objetos que especifica os tipos dos parâmetros do método dinâmico, ou null se o método não tiver parâmetros.

m
Module

A Module representa o módulo com o qual o método dinâmico deve ser logicamente associado.

skipVisibility
Boolean

true para evitar verificações de visibilidade JIT sobre tipos e membros acedidos pelo MSIL do método dinâmico; caso contrário, false.

Exceções

Um elemento de parameterTypes é null ou Void.

-ou-

m é um módulo que fornece alojamento anónimo para métodos dinâmicos.

name é null.

-ou-

m é null.

attributes é uma combinação de bandeiras diferentes de Public e Static.

-ou-

callingConvention não Standardé .

-ou-

returnType é um tipo para o qual IsByRef retorna true.

Observações

O método dinâmico criado com este construtor tem acesso a membros públicos e internal (Friend em Visual Basic) de todos os tipos públicos e internos contidos no módulo m.

Ignorar as verificações de visibilidade do compilador JIT permite ao método dinâmico aceder a membros privados e protegidos de todos os outros tipos no módulo e em todos os outros assemblies também. Isto é útil, por exemplo, ao escrever código para serializar objetos.

Note

Para compatibilidade retroativa, este construtor exige SecurityPermission com o sinalizador SecurityPermissionFlag.ControlEvidence se as seguintes condições ambas se verificarem: m é um módulo diferente do módulo chamador, e a exigência de ReflectionPermission com o sinalizador ReflectionPermissionFlag.MemberAccess falhou. Se a solicitação SecurityPermission for bem-sucedida, a operação é permitida.

Ver também

Aplica-se a

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

Cria um método dinâmico, especificando o nome do método, atributos, convenção de chamada, tipo de retorno, tipos de parâmetro, o tipo com que o método dinâmico está logicamente associado e se as verificações de visibilidade just-in-time (JIT) devem ser ignoradas para tipos e membros acedidos pela linguagem intermédia Microsoft (MSIL) do 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

O nome do método dinâmico. Isto pode ser uma corda de comprimento zero, mas não pode ser null.

attributes
MethodAttributes

Uma combinação bit a bit de MethodAttributes valores que especifica os atributos do método dinâmico. A única combinação permitida é Public e Static.

callingConvention
CallingConventions

A convenção de chamada para o método dinâmico. Deve ser Standard.

returnType
Type

Um objeto que especifica o tipo de retorno do método dinâmico, ou null se o método não tiver tipo de Type retorno.

parameterTypes
Type[]

Um array de Type objetos que especifica os tipos dos parâmetros do método dinâmico, ou null se o método não tiver parâmetros.

owner
Type

A Type com o qual o método dinâmico está logicamente associado. O método dinâmico tem acesso a todos os membros do tipo.

skipVisibility
Boolean

true para evitar verificações de visibilidade JIT sobre tipos e membros acedidos pelo MSIL do método dinâmico; caso contrário, false.

Exceções

Um elemento de parameterTypes é null ou Void.

-ou-

owner é uma interface, um array, um tipo genérico aberto, ou um parâmetro de tipo de um tipo ou método genérico.

name é null.

-ou-

owner é null.

attributes é uma combinação de bandeiras diferentes de Public e Static.

-ou-

callingConvention não Standardé .

-ou-

returnType é um tipo para o qual IsByRef retorna true.

Observações

O método dinâmico é global ao módulo que contém o tipo owner. Tem acesso a todos os membros do tipo owner.

O método dinâmico criado com este construtor tem acesso a todos os membros do tipo owner, e a membros públicos e internal (Friend em Visual Basic) de todos os tipos contidos no módulo que contém owner. Ignorar as verificações de visibilidade do compilador JIT permite que o método dinâmico aceda a membros privados e protegidos de todos os outros tipos também. Isto é útil, por exemplo, ao escrever código para serializar objetos.

Note

Para compatibilidade retroativa, este construtor exige SecurityPermission com a SecurityPermissionFlag.ControlEvidence flag se ambas as seguintes condições forem verdadeiras: owner está num módulo diferente daquele que faz a chamada, e a exigência de ReflectionPermission com a ReflectionPermissionFlag.MemberAccess flag falhou. Se a solicitação SecurityPermission for bem-sucedida, a operação é permitida.

Ver também

Aplica-se a