Compartilhar via


DynamicMethod Construtores

Definição

Cria um método dinâmico.

Sobrecargas

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âmetro.

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

Inicializa um método dinâmico hospedado anonimamente, especificando o nome do método, o tipo de retorno, os tipos de parâmetro e se as verificações de visibilidade JIT (Just-In-Time) devem ser ignoradas para os tipos e membros acessados pelo MSIL (Microsoft Intermediate Language) do método dinâmico.

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

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

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

Cria um método dinâmico, especificando o nome do método, o tipo de retorno, os tipos de parâmetro e o tipo ao qual 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, o tipo de retorno, os tipos de parâmetro, o módulo e se as verificações de visibilidade JIT (just-in-time) devem ser ignoradas para os tipos e membros acessados pelo MSIL (Microsoft Intermediate Language) do método dinâmico.

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

Cria um método dinâmico, especificando o nome do método, o tipo de retorno, os tipos de parâmetro, o tipo como qual o método dinâmico é logicamente associado e se as verificações de visibilidade JIT (just-in-time) devem ser ignoradas para tipos e membros acessados pelo MSIL (Microsoft Intermediate Language) 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, os atributos, a convenção de chamada, o tipo de retorno, os tipos de parâmetro, o módulo e se as verificações de visibilidade JIT (just-in-time) devem ser ignoradas para os tipos e membros acessados pelo MSIL (Microsoft Intermediate Language) 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, os atributos, a convenção de chamada, o tipo de retorno, os tipos de parâmetro, o tipo como qual o método dinâmico é logicamente associado e se as verificações de visibilidade JIT (just-in-time) devem ser ignoradas para tipos e membros acessados pelo MSIL (Microsoft Intermediate Language) do método dinâmico.

DynamicMethod(String, Type, Type[])

Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs

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

public:
 DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes);
public DynamicMethod (string name, Type? returnType, 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. Isso pode ser uma cadeia de comprimento zero, mas não pode ser null.

returnType
Type

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

parameterTypes
Type[]

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

Exceções

Um elemento de parameterTypes é null ou Void.

name é null.

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

Comentários

O método dinâmico criado por esse construtor é associado a um assembly anônimo em vez de um tipo ou módulo existente. O assembly anônimo existe apenas para fornecer um ambiente de área restrita para métodos dinâmicos, ou seja, para isolá-los de outro código. Esse ambiente torna seguro que o método dinâmico seja emitido e executado por código parcialmente confiável.

Esse construtor especifica que as verificações de visibilidade JIT (Just-In-Time) serão impostas para a MSIL (Microsoft Intermediate Language) do método dinâmico. Ou seja, o código no método dinâmico tem acesso a métodos públicos de classes públicas. Exceções serão geradas se o método tentar acessar tipos ou membros que são private, protectedou internal (Friend no Visual Basic). Para criar um método dinâmico que tenha a capacidade restrita de ignorar 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 assembly emissor é incluída. Quando o método é invocado, as permissões do assembly emissor são usadas em vez das permissões do chamador real. Portanto, o método dinâmico não pode ser executado em um nível mais alto de privilégio do que o do assembly que o emitiu, mesmo que ele seja passado e executado por um assembly que tenha um nível de confiança mais alto.

Esse construtor especifica os atributos MethodAttributes.Public de método e MethodAttributes.Statice a convenção de chamada CallingConventions.Standard.

Observação

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

Confira também

Aplica-se a

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

Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs

Inicializa um método dinâmico hospedado anonimamente, especificando o nome do método, o tipo de retorno, os tipos de parâmetro e se as verificações de visibilidade JIT (Just-In-Time) devem ser ignoradas para os tipos e membros acessados pelo MSIL (Microsoft Intermediate Language) 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);
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. Isso pode ser uma cadeia de comprimento zero, mas não pode ser null.

returnType
Type

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

parameterTypes
Type[]

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

restrictedSkipVisibility
Boolean

true para ignorar as verificações de visibilidade JIT nos tipos e membros acessados pelo MSIL do método dinâmico, com essa restrição: o nível de confiança dos assemblies que contêm esses tipos e membros deve ser igual ou menor do que o 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 do .NET Core anteriores à 2.1: returnType é um tipo para o qual IsByRef retorna true.

Comentários

O método dinâmico criado por esse construtor é associado a um assembly anônimo em vez de um tipo ou módulo existente. O assembly anônimo existe apenas para fornecer um ambiente de área restrita para métodos dinâmicos, ou seja, para isolá-los de outro código. Esse ambiente torna seguro que o método dinâmico seja emitido e executado por código parcialmente confiável.

Os métodos dinâmicos hospedados anonimamente não têm acesso automático a nenhum tipo ou membro que seja private, protectedou internal (Friend no Visual Basic). Isso é diferente dos métodos dinâmicos associados a um tipo ou módulo existente, que têm acesso a membros ocultos em seu escopo associado.

Especifique true para restrictedSkipVisibility se o método dinâmico precisa acessar tipos ou membros que são private, protectedou internal. Isso fornece ao método dinâmico acesso restrito a esses membros. Ou seja, os membros só poderão ser acessados se as seguintes condições forem atendidas:

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

  • A pilha de chamadas que emite o método dinâmico é concedida ReflectionPermission com o ReflectionPermissionFlag.RestrictedMemberAccess sinalizador . Isso é sempre verdadeiro quando o código é executado com confiança total. Para código parcialmente confiável, ele será verdadeiro somente se o host conceder explicitamente a permissão.

    Importante

    Se a permissão não tiver sido concedida, uma exceção de segurança será gerada quando CreateDelegate for chamado ou quando o método dinâmico for invocado, não quando esse construtor for chamado. Nenhuma permissão especial é necessária para emitir o método dinâmico.

Por exemplo, um método dinâmico criado com restrictedSkipVisibility definido como true poderá acessar um membro privado de qualquer assembly na pilha de chamadas se a pilha de chamadas tiver recebido acesso restrito a membros. Se o método dinâmico for criado com código parcialmente confiável na pilha de chamadas, ele não poderá acessar um membro privado de um tipo em um assembly .NET Framework, pois esses assemblies são totalmente confiáveis.

Se restrictedSkipVisibility for false, as verificações de visibilidade JIT serão impostas. O código no método dinâmico tem acesso a métodos públicos de classes públicas, e exceções são geradas se ele tenta acessar tipos ou membros que são private, protectedou internal.

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

Esse construtor especifica os atributos MethodAttributes.Public de método e MethodAttributes.Statice a convenção de chamada CallingConventions.Standard.

Observação

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

Confira também

Aplica-se a

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

Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs

Cria um método dinâmico global para um módulo, especificando o nome do método, o tipo de retorno, os tipos de parâmetro e o 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);
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. Isso pode ser uma cadeia de comprimento zero, mas não pode ser null.

returnType
Type

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

parameterTypes
Type[]

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

m
Module

Um Module que 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 hospedagem anônima para métodos dinâmicos.

name é null.

- ou -

m é null.

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

Exemplos

O exemplo de código a seguir cria um método dinâmico que usa dois parâmetros. O exemplo emite um corpo de função simples que imprime o primeiro parâmetro no console e o exemplo usa o segundo parâmetro como o valor retornado do método . O exemplo conclui o método criando um delegado, invoca o delegado com parâmetros diferentes e, por fim, invoca o método dinâmico usando o Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) método .

using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;

public ref class Test
{   
};

// Declare a delegate that will be used to execute the completed
// dynamic method.
delegate int HelloInvoker(String^ msg, int ret);

int 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.
    array<Type^>^ helloArgs = {String::typeid, int::typeid};

    // 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 = gcnew DynamicMethod("Hello", 
        int::typeid,
        helloArgs,
        Test::typeid->Module);

    // Create an array that specifies the parameter types of the
    // overload of Console.WriteLine to be used in Hello.
    array<Type^>^ writeStringArgs = {String::typeid};
    // Get the overload of Console.WriteLine that has one
    // String parameter.
    MethodInfo^ writeString =
        Console::typeid->GetMethod("WriteLine", writeStringArgs);

    // Get an ILGenerator and emit a body for the dynamic method.
    ILGenerator^ ilgen = hello->GetILGenerator();
    // Load the first argument, which is a string, onto the stack.
    ilgen->Emit(OpCodes::Ldarg_0);
    // Call the overload of Console.WriteLine that prints a string.
    ilgen->EmitCall(OpCodes::Call, writeString, nullptr);
    // The Hello method returns the value of the second argument;
    // to do this, load the onto the stack and return.
    ilgen->Emit(OpCodes::Ldarg_1);
    ilgen->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^ helloDelegate =
        (HelloInvoker^) hello->CreateDelegate(HelloInvoker::typeid);

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

    // Do it again, with different arguments.
    returnValue = helloDelegate("\r\nHi, Mom!", 5280);
    Console::WriteLine("helloDelegate(\"Hi, Mom!\", 5280) returned {0}",
        returnValue);

    // Create an array of arguments to use with the Invoke method.
    array<Object^>^ delegateArgs = {"\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^ returnValueObject = hello->Invoke(nullptr, delegateArgs);
    Console::WriteLine("hello.Invoke returned {0}", returnValueObject);
}
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
'

Comentários

Esse construtor especifica atributos MethodAttributes.Public de método e MethodAttributes.Static, convenção de chamada CallingConventions.Standarde não ignora verificações de visibilidade JIT (just-in-time).

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

Observação

Para compatibilidade com versões anteriores SecurityPermission , esse construtor exigirá com o SecurityPermissionFlag.ControlEvidence sinalizador se as seguintes condições forem verdadeiras: m é um módulo diferente do módulo de chamada e a demanda por ReflectionPermission com o ReflectionPermissionFlag.MemberAccess sinalizador falhou. Se a demanda por SecurityPermission for bem-sucedida, a operação será permitida.

Confira também

Aplica-se a

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

Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs

Cria um método dinâmico, especificando o nome do método, o tipo de retorno, os tipos de parâmetro e o tipo ao qual 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);
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. Isso pode ser uma cadeia de comprimento zero, mas não pode ser null.

returnType
Type

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

parameterTypes
Type[]

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

owner
Type

Um Type ao 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, uma matriz, um tipo genérico aberto ou um parâmetro de tipo de um método ou tipo genérico.

name é null.

- ou -

owner é null.

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

Exemplos

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

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

Em seguida, o código de exemplo cria um DynamicMethod que altera o campo privado de uma instância de Example e retorna o valor anterior.

Observação

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

O código de exemplo cria uma instância de Example e, em seguida, cria dois delegados. O primeiro é do tipo UseLikeStatic, que tem os mesmos parâmetros que o método dinâmico. O segundo é do tipo UseLikeInstance, que não tem o primeiro parâmetro (do tipo Example). Esse delegado é criado usando a sobrecarga do CreateDelegate(Type, Object) método; o segundo parâmetro dessa sobrecarga de método é uma instância de Example, nesse caso, a instância recém-criada, que está associada ao delegado recém-criado. Sempre que esse delegado é invocado, o método dinâmico atua na instância associada de Example.

Observação

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

O UseLikeStatic delegado é invocado, passando a instância do Example que está associada ao UseLikeInstance delegado. Em seguida, o UseLikeInstance delegado é invocado, para que ambos os delegados atuem na mesma instância do Example. As alterações nos valores do campo interno são exibidas após cada chamada. Por fim, um UseLikeInstance delegado está associado a uma instância do DerivedFromExamplee 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'

Comentários

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

Esse construtor especifica atributos MethodAttributes.Public de método e MethodAttributes.Static, convenção CallingConventions.Standardde chamada e não ignora verificações de visibilidade JIT (just-in-time).

Observação

Para compatibilidade com versões SecurityPermission anteriores, esse construtor exigirá com o SecurityPermissionFlag.ControlEvidence sinalizador se as seguintes condições forem verdadeiras: owner está em um módulo diferente do módulo de chamada e a demanda por ReflectionPermission com o ReflectionPermissionFlag.MemberAccess sinalizador falhou. Se a demanda por SecurityPermission for bem-sucedida, a operação será permitida.

Confira também

Aplica-se a

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

Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs

Cria um método dinâmico que é global para um módulo, especificando o nome do método, o tipo de retorno, os tipos de parâmetro, o módulo e se as verificações de visibilidade JIT (just-in-time) devem ser ignoradas para os tipos e membros acessados pelo MSIL (Microsoft Intermediate Language) 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);
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. Isso pode ser uma cadeia de comprimento zero, mas não pode ser null.

returnType
Type

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

parameterTypes
Type[]

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

m
Module

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

skipVisibility
Boolean

true para ignorar as verificações de visibilidade JIT nos tipos e membros acessados pelo MSIL do método dinâmico.

Exceções

Um elemento de parameterTypes é null ou Void.

- ou -

m é um módulo que fornece hospedagem anônima para métodos dinâmicos.

name é null.

- ou -

m é null.

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

Comentários

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

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

Observação

Para compatibilidade com versões SecurityPermission anteriores, esse construtor exigirá com o SecurityPermissionFlag.ControlEvidence sinalizador se as seguintes condições forem verdadeiras: m é um módulo diferente do módulo de chamada e a demanda por ReflectionPermission com o ReflectionPermissionFlag.MemberAccess sinalizador falhou. Se a demanda por SecurityPermission for bem-sucedida, a operação será permitida.

Confira também

Aplica-se a

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

Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs

Cria um método dinâmico, especificando o nome do método, o tipo de retorno, os tipos de parâmetro, o tipo como qual o método dinâmico é logicamente associado e se as verificações de visibilidade JIT (just-in-time) devem ser ignoradas para tipos e membros acessados pelo MSIL (Microsoft Intermediate Language) 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);
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. Isso pode ser uma cadeia de comprimento zero, mas não pode ser null.

returnType
Type

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

parameterTypes
Type[]

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

owner
Type

Um Type ao 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 ignorar as verificações de visibilidade JIT nos tipos e membros acessados pelo MSIL do método dinâmico, caso contrário, false.

Exceções

Um elemento de parameterTypes é null ou Void.

- ou -

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

name é null.

- ou -

owner é null.

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

Comentários

O método dinâmico criado com esse construtor tem acesso a todos os membros do tipo ownere a 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 acesse também membros privados e protegidos de todos os outros tipos. Isso é útil, por exemplo, ao escrever código para serializar objetos.

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

Observação

Para compatibilidade com versões SecurityPermission anteriores, esse construtor exigirá com o SecurityPermissionFlag.ControlEvidence sinalizador se as seguintes condições forem verdadeiras: owner está em um módulo diferente do módulo de chamada e a demanda por ReflectionPermission com o ReflectionPermissionFlag.MemberAccess sinalizador falhou. Se a demanda por SecurityPermission for bem-sucedida, a operação será permitida.

Confira também

Aplica-se a

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

Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs

Cria um método dinâmico que é global para um módulo, especificando o nome do método, os atributos, a convenção de chamada, o tipo de retorno, os tipos de parâmetro, o módulo e se as verificações de visibilidade JIT (just-in-time) devem ser ignoradas para os tipos e membros acessados pelo MSIL (Microsoft Intermediate Language) 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);
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. Isso pode ser uma cadeia de comprimento zero, mas não pode ser null.

attributes
MethodAttributes

Uma combinação bit a bit de valores MethodAttributes 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 Type que especifica o tipo de retorno do método dinâmico ou null se o método não tiver nenhum tipo de retorno.

parameterTypes
Type[]

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

m
Module

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

skipVisibility
Boolean

true para ignorar as verificações de visibilidade JIT nos tipos e membros acessados 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 hospedagem anônima para métodos dinâmicos.

name é null.

- ou -

m é null.

attributes é uma combinação de sinalizadores diferente de Public e Static.

- ou -

callingConvention não é Standard.

- ou -

returnType é um tipo para o qual IsByRef retorna true.

Comentários

O método dinâmico criado com esse construtor tem acesso a membros públicos e internal (Friend no 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 que o método dinâmico acesse membros privados e protegidos de todos os outros tipos no módulo e em todos os outros assemblies também. Isso é útil, por exemplo, ao escrever código para serializar objetos.

Observação

Para compatibilidade com versões SecurityPermission anteriores, esse construtor exigirá com o SecurityPermissionFlag.ControlEvidence sinalizador se as seguintes condições forem verdadeiras: m é um módulo diferente do módulo de chamada e a demanda por ReflectionPermission com o ReflectionPermissionFlag.MemberAccess sinalizador falhou. Se a demanda por SecurityPermission for bem-sucedida, a operação será permitida.

Confira também

Aplica-se a

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

Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs
Origem:
DynamicMethod.cs

Cria um método dinâmico, especificando o nome do método, os atributos, a convenção de chamada, o tipo de retorno, os tipos de parâmetro, o tipo como qual o método dinâmico é logicamente associado e se as verificações de visibilidade JIT (just-in-time) devem ser ignoradas para tipos e membros acessados pelo MSIL (Microsoft Intermediate Language) 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);
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. Isso pode ser uma cadeia de comprimento zero, mas não pode ser null.

attributes
MethodAttributes

Uma combinação bit a bit de valores MethodAttributes 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 Type que especifica o tipo de retorno do método dinâmico ou null se o método não tiver nenhum tipo de retorno.

parameterTypes
Type[]

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

owner
Type

Um Type ao 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 ignorar as verificações de visibilidade JIT nos tipos e membros acessados pelo MSIL do método dinâmico, caso contrário, false.

Exceções

Um elemento de parameterTypes é null ou Void.

- ou -

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

name é null.

- ou -

owner é null.

attributes é uma combinação de sinalizadores diferente de Public e Static.

- ou -

callingConvention não é Standard.

- ou -

returnType é um tipo para o qual IsByRef retorna true.

Comentários

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

O método dinâmico criado com esse construtor tem acesso a todos os membros do tipo ownere aos membros públicos e internal (Friend no 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 acesse também membros privados e protegidos de todos os outros tipos. Isso é útil, por exemplo, ao escrever código para serializar objetos.

Observação

Para compatibilidade com versões SecurityPermission anteriores, esse construtor exigirá com o SecurityPermissionFlag.ControlEvidence sinalizador se as seguintes condições forem verdadeiras: owner está em um módulo diferente do módulo de chamada e a demanda por ReflectionPermission com o ReflectionPermissionFlag.MemberAccess sinalizador falhou. Se a demanda por SecurityPermission for bem-sucedida, a operação será permitida.

Confira também

Aplica-se a