Partager via


DynamicMethod Constructeurs

Définition

Crée une méthode dynamique.

Surcharges

DynamicMethod(String, Type, Type[])

Initialise une méthode dynamique hébergée de manière anonyme, en spécifiant le nom de la méthode, le type de retour et les types de paramètres.

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

Initialise une méthode dynamique hébergée de façon anonyme, en spécifiant le nom de la méthode, le type de retour, les types de paramètre et si les contrôles de visibilité juste-à-temps (JIT) doivent être ignorés pour les types et membres auxquels accède le langage MSIL (Microsoft Intermediate Language) de la méthode dynamique.

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

Crée une méthode dynamique qui est globale pour un module, en spécifiant le nom de la méthode, le type de retour, les types de paramètres et le module.

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

Crée une méthode dynamique, en spécifiant le nom de la méthode, le type de retour, les types de paramètres et le type avec lequel la méthode dynamique est logiquement associée.

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

Crée une méthode dynamique qui est globale pour un module, en spécifiant le nom de la méthode, le type de retour, les types de paramètre, le module et si les contrôles de visibilité juste-à-temps (JIT) doivent être ignorés pour les types et membres auxquels a accès le langage MSIL (Microsoft Intermediate Language) de la méthode dynamique.

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

Crée une méthode dynamique, en spécifiant le nom de la méthode, le type de retour, les types de paramètre, le type auquel la méthode dynamique est associée logiquement, et si les contrôles de visibilité juste-à-temps (JIT) doivent être ignorés pour les types et membres auxquels accède le langage MSIL (Microsoft Intermediate Language) de la méthode dynamique.

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

Crée une méthode dynamique qui est globale pour un module, en spécifiant le nom de la méthode, les attributs, les conventions d'appel, le type de retour, les types de paramètres, le module et si les contrôles de visibilité juste-à-temps (JIT) doivent être ignorés pour les types et membres auxquels accède le langage Microsoft Intermediate Language (MSIL) de la méthode dynamique.

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

Crée une méthode dynamique, en spécifiant le nom de la méthode, les attributs, la convention d’appel, le type de retour, les types de paramètre, le type auquel la méthode dynamique est associée logiquement, et si les contrôles de visibilité juste-à-temps (JIT) doivent être ignorés pour les types et membres auxquels accède le langage MSIL (Microsoft Intermediate Language) de la méthode dynamique.

DynamicMethod(String, Type, Type[])

Source:
DynamicMethod.cs
Source:
DynamicMethod.cs
Source:
DynamicMethod.cs

Initialise une méthode dynamique hébergée de manière anonyme, en spécifiant le nom de la méthode, le type de retour et les types de paramètres.

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())

Paramètres

name
String

Nom de la méthode dynamique. Il peut s’agir d’une chaîne de longueur nulle, mais pas de null.

returnType
Type

Objet Type qui spécifie le type de retour de la méthode dynamique, ou null si la méthode n’a aucun type de retour.

parameterTypes
Type[]

Tableau d’objets Type spécifiant les types des paramètres de la méthode dynamique, ou null si la méthode ne possède aucun paramètre.

Exceptions

Un élément de parameterTypes a la valeur null ou Void.

name a la valeur null.

.NET Framework et .NET Core versions antérieures à 2.1 : returnType est un type pour lequel IsByRef retourne true.

Remarques

La méthode dynamique créée par ce constructeur est associée à un assembly anonyme au lieu d’un type ou d’un module existant. L’assembly anonyme existe uniquement pour fournir un environnement de bac à sable pour les méthodes dynamiques, c’est-à-dire pour les isoler des autres codes. Cet environnement permet à la méthode dynamique d’être émise et exécutée par du code partiellement approuvé.

Ce constructeur spécifie que les vérifications de visibilité juste-à-temps (JIT) seront appliquées pour le langage intermédiaire Microsoft (MSIL) de la méthode dynamique. Autrement dit, le code de la méthode dynamique a accès aux méthodes publiques des classes publiques. Des exceptions sont levées si la méthode tente d’accéder aux types ou aux membres qui sont private, protectedou internal (Friend en Visual Basic). Pour créer une méthode dynamique qui a une capacité limitée à ignorer les vérifications de visibilité JIT, utilisez le DynamicMethod(String, Type, Type[], Boolean) constructeur.

Lorsqu’une méthode dynamique hébergée anonymement est construite, la pile des appels de l’assembly émetteur est incluse. Lorsque la méthode est appelée, les autorisations de l’assembly émetteur sont utilisées au lieu des autorisations de l’appelant réel. Par conséquent, la méthode dynamique ne peut pas s’exécuter à un niveau de privilège supérieur à celui de l’assembly qui l’a émise, même si elle est transmise et exécutée par un assembly qui a un niveau de confiance plus élevé.

Ce constructeur spécifie les attributs MethodAttributes.Public de méthode et MethodAttributes.Static, et la convention CallingConventions.Standardappelante .

Notes

Ce constructeur a été introduit dans .NET Framework 3.5 ou version ultérieure.

Voir aussi

S’applique à

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

Source:
DynamicMethod.cs
Source:
DynamicMethod.cs
Source:
DynamicMethod.cs

Initialise une méthode dynamique hébergée de façon anonyme, en spécifiant le nom de la méthode, le type de retour, les types de paramètre et si les contrôles de visibilité juste-à-temps (JIT) doivent être ignorés pour les types et membres auxquels accède le langage MSIL (Microsoft Intermediate Language) de la méthode dynamique.

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)

Paramètres

name
String

Nom de la méthode dynamique. Il peut s’agir d’une chaîne de longueur nulle, mais pas de null.

returnType
Type

Objet Type qui spécifie le type de retour de la méthode dynamique, ou null si la méthode n’a aucun type de retour.

parameterTypes
Type[]

Tableau d’objets Type spécifiant les types des paramètres de la méthode dynamique, ou null si la méthode ne possède aucun paramètre.

restrictedSkipVisibility
Boolean

true pour ignorer les contrôles de visibilité juste-à-temps pour les types et membres auxquels accède le langage MSIL de la méthode dynamique, avec cette restriction : le niveau d’approbation des assemblys qui contiennent ces types et membres doit être inférieur ou égal à celui de la pile des appels qui émet la méthode dynamique ; sinon, false.

Exceptions

Un élément de parameterTypes a la valeur null ou Void.

name a la valeur null.

.NET Framework et .NET Core versions antérieures à 2.1 : returnType est un type pour lequel IsByRef retourne true.

Remarques

La méthode dynamique créée par ce constructeur est associée à un assembly anonyme au lieu d’un type ou d’un module existant. L’assembly anonyme existe uniquement pour fournir un environnement de bac à sable pour les méthodes dynamiques, c’est-à-dire pour les isoler des autres codes. Cet environnement permet à la méthode dynamique d’être émise et exécutée par du code partiellement approuvé.

Les méthodes dynamiques hébergées de manière anonyme n’ont pas d’accès automatique aux types ou membres qui sont private, protectedou internal (Friend en Visual Basic). Cela diffère des méthodes dynamiques associées à un type ou module existant, qui ont accès aux membres masqués dans leur étendue associée.

Spécifiez true si votre méthode dynamique doit accéder aux types ou aux membres qui sont private, protectedou internal.restrictedSkipVisibility Cela donne à la méthode dynamique un accès restreint à ces membres. Autrement dit, les membres sont accessibles uniquement si les conditions suivantes sont remplies :

  • Les membres cibles appartiennent à un assembly dont le niveau de confiance est égal ou inférieur à celui de la pile d’appels qui émet la méthode dynamique.

  • La pile d’appels qui émet la méthode dynamique est accordée ReflectionPermission avec l’indicateur ReflectionPermissionFlag.RestrictedMemberAccess . Cela est toujours vrai lorsque le code est exécuté avec une confiance totale. Pour le code partiellement approuvé, elle est vraie uniquement si l’hôte accorde explicitement l’autorisation.

    Important

    Si l’autorisation n’a pas été accordée, une exception de sécurité est levée quand CreateDelegate est appelé ou lorsque la méthode dynamique est appelée, et non quand ce constructeur est appelé. Aucune autorisation spéciale n’est requise pour émettre la méthode dynamique.

Par exemple, une méthode dynamique créée avec restrictedSkipVisibility défini sur peut accéder à true un membre privé de n’importe quel assembly sur la pile d’appels si l’accès aux membres est restreint à la pile d’appels. Si la méthode dynamique est créée avec du code partiellement approuvé sur la pile des appels, elle ne peut pas accéder à un membre privé d’un type dans un assembly .NET Framework, car ces assemblys sont entièrement approuvés.

Si restrictedSkipVisibility a la valeur false, les vérifications de visibilité JIT sont appliquées. Le code de la méthode dynamique a accès aux méthodes publiques des classes publiques, et des exceptions sont levées s’il tente d’accéder aux types ou aux membres qui sont private, protectedou internal.

Lorsqu’une méthode dynamique hébergée anonymement est construite, la pile des appels de l’assembly émetteur est incluse. Lorsque la méthode est appelée, les autorisations de la pile d’appels émettrices sont utilisées à la place des autorisations de l’appelant réel. Par conséquent, la méthode dynamique ne peut pas s’exécuter à un niveau de privilège supérieur à celui de l’assembly qui l’a émise, même si elle est transmise et exécutée par un assembly qui a un niveau de confiance plus élevé.

Ce constructeur spécifie les attributs MethodAttributes.Public de méthode et MethodAttributes.Static, et la convention CallingConventions.Standardappelante .

Notes

Ce constructeur a été introduit dans .NET Framework 3.5 ou version ultérieure.

Voir aussi

S’applique à

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

Source:
DynamicMethod.cs
Source:
DynamicMethod.cs
Source:
DynamicMethod.cs

Crée une méthode dynamique qui est globale pour un module, en spécifiant le nom de la méthode, le type de retour, les types de paramètres et le module.

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)

Paramètres

name
String

Nom de la méthode dynamique. Il peut s’agir d’une chaîne de longueur nulle, mais pas de null.

returnType
Type

Objet Type qui spécifie le type de retour de la méthode dynamique, ou null si la méthode n’a aucun type de retour.

parameterTypes
Type[]

Tableau d’objets Type spécifiant les types des paramètres de la méthode dynamique, ou null si la méthode ne possède aucun paramètre.

m
Module

Module représentant le module auquel la méthode dynamique doit être associée de manière logique.

Exceptions

Un élément de parameterTypes a la valeur null ou Void.

- ou -

m est un module qui fournit l’hébergement anonyme pour les méthodes dynamiques.

name a la valeur null.

-ou-

m a la valeur null.

.NET Framework et .NET Core versions antérieures à 2.1 : returnType est un type pour lequel IsByRef retourne true.

Exemples

L’exemple de code suivant crée une méthode dynamique qui prend deux paramètres. L’exemple émet un corps de fonction simple qui imprime le premier paramètre dans la console, et l’exemple utilise le deuxième paramètre comme valeur de retour de la méthode. L’exemple complète la méthode en créant un délégué, appelle le délégué avec différents paramètres et appelle enfin la méthode dynamique à l’aide de la Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) méthode .

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
'

Remarques

Ce constructeur spécifie les attributs MethodAttributes.Public de méthode et MethodAttributes.Static, la convention CallingConventions.Standardappelante , et n’ignore pas les vérifications de visibilité juste-à-temps (JIT).

La méthode dynamique créée avec ce constructeur a accès aux membres publics et internal (Friend en Visual Basic) de tous les types contenus dans le module m.

Notes

Pour la compatibilité descendante, ce constructeur demande SecurityPermission avec l’indicateur SecurityPermissionFlag.ControlEvidence si les conditions suivantes sont remplies : m est un module autre que le module appelant et que la demande pour ReflectionPermission avec l’indicateur ReflectionPermissionFlag.MemberAccess a échoué. Si la demande aboutit SecurityPermission , l’opération est autorisée.

Voir aussi

S’applique à

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

Source:
DynamicMethod.cs
Source:
DynamicMethod.cs
Source:
DynamicMethod.cs

Crée une méthode dynamique, en spécifiant le nom de la méthode, le type de retour, les types de paramètres et le type avec lequel la méthode dynamique est logiquement associée.

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)

Paramètres

name
String

Nom de la méthode dynamique. Il peut s’agir d’une chaîne de longueur nulle, mais pas de null.

returnType
Type

Objet Type qui spécifie le type de retour de la méthode dynamique, ou null si la méthode n’a aucun type de retour.

parameterTypes
Type[]

Tableau d’objets Type spécifiant les types des paramètres de la méthode dynamique, ou null si la méthode ne possède aucun paramètre.

owner
Type

Type avec lequel la méthode dynamique est logiquement associée. La méthode dynamique a accès à tous les membres du type.

Exceptions

Un élément de parameterTypes a la valeur null ou Void.

- ou -

owner est une interface, un tableau, un type générique ouvert ou un paramètre de type d’un type générique ou d’une méthode.

name a la valeur null.

-ou-

owner a la valeur null.

.NET Framework et .NET Core versions antérieures à 2.1 : returnType est un type pour lequel IsByRef retourne true.

Exemples

L’exemple de code suivant crée un DynamicMethod qui est associé logiquement à un type. Cette association lui donne accès aux membres privés de ce type.

L’exemple de code définit une classe nommée Example avec un champ privé, une classe nommée DerivedFromExample qui dérive de la première classe, un type délégué nommé UseLikeStatic qui retourne Int32 et a des paramètres de type Example et Int32, et un type délégué nommé UseLikeInstance qui retourne Int32 et a un paramètre de type Int32.

L’exemple de code crée ensuite un DynamicMethod qui modifie le champ privé d’un instance de Example et retourne la valeur précédente.

Notes

En général, la modification des champs internes des classes n’est pas une bonne pratique de codage orienté objet.

L’exemple de code crée un instance deExample, puis crée deux délégués. La première est de type UseLikeStatic, qui a les mêmes paramètres que la méthode dynamique. Le deuxième est de type UseLikeInstance, qui n’a pas le premier paramètre (de type Example). Ce délégué est créé à l’aide de la CreateDelegate(Type, Object) surcharge de méthode ; le deuxième paramètre de cette surcharge de méthode est un instance de Example, dans ce cas, le instance qui vient de se créer, qui est lié au délégué nouvellement créé. Chaque fois que ce délégué est appelé, la méthode dynamique agit sur la instance liée de Example.

Notes

Il s’agit d’un exemple des règles assouplies pour la liaison de délégué introduites dans .NET Framework 2.0, ainsi que de nouvelles surcharges de la Delegate.CreateDelegate méthode. Pour plus d'informations, consultez la classe Delegate.

Le UseLikeStatic délégué est appelé, en passant le instance de Example qui est lié au UseLikeInstance délégué. Ensuite, le UseLikeInstance délégué est appelé, afin que les deux délégués agissent sur le même instance de Example. Les modifications apportées aux valeurs du champ interne s’affichent après chaque appel. Enfin, un UseLikeInstance délégué est lié à un instance de DerivedFromExample, et les appels de délégués sont répétés.

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'

Remarques

La méthode dynamique créée avec ce constructeur a accès à tous les membres du type owner, et aux membres publics et internal (Friend en Visual Basic) de tous les autres types dans le module qui contient owner.

Ce constructeur spécifie les attributs MethodAttributes.Public de méthode et MethodAttributes.Static, la convention CallingConventions.Standardappelante , et n’ignore pas les vérifications de visibilité juste-à-temps (JIT).

Notes

Pour la compatibilité descendante, ce constructeur exige SecurityPermission l’indicateur SecurityPermissionFlag.ControlEvidence si les conditions suivantes sont remplies : owner se trouve dans un module autre que le module appelant et que la demande pour ReflectionPermission avec l’indicateur ReflectionPermissionFlag.MemberAccess a échoué. Si la demande aboutit SecurityPermission , l’opération est autorisée.

Voir aussi

S’applique à

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

Source:
DynamicMethod.cs
Source:
DynamicMethod.cs
Source:
DynamicMethod.cs

Crée une méthode dynamique qui est globale pour un module, en spécifiant le nom de la méthode, le type de retour, les types de paramètre, le module et si les contrôles de visibilité juste-à-temps (JIT) doivent être ignorés pour les types et membres auxquels a accès le langage MSIL (Microsoft Intermediate Language) de la méthode dynamique.

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)

Paramètres

name
String

Nom de la méthode dynamique. Il peut s’agir d’une chaîne de longueur nulle, mais pas de null.

returnType
Type

Objet Type qui spécifie le type de retour de la méthode dynamique, ou null si la méthode n’a aucun type de retour.

parameterTypes
Type[]

Tableau d’objets Type spécifiant les types des paramètres de la méthode dynamique, ou null si la méthode ne possède aucun paramètre.

m
Module

Module représentant le module auquel la méthode dynamique doit être associée de manière logique.

skipVisibility
Boolean

true pour ignorer les contrôles de visibilité JIT sur les types et les membres auxquels a accès le langage MSIL de la méthode dynamique.

Exceptions

Un élément de parameterTypes a la valeur null ou Void.

- ou -

m est un module qui fournit l’hébergement anonyme pour les méthodes dynamiques.

name a la valeur null.

-ou-

m a la valeur null.

.NET Framework et .NET Core versions antérieures à 2.1 : returnType est un type pour lequel IsByRef retourne true.

Remarques

Ce constructeur spécifie les attributs MethodAttributes.Public de méthode et MethodAttributes.Static, et la convention CallingConventions.Standardappelante .

La méthode dynamique créée avec ce constructeur a accès aux membres publics et internal (Friend en Visual Basic) de tous les types dans le module mcontenu . Ignorer les vérifications de visibilité du compilateur JIT permet à la méthode dynamique d’accéder également aux membres privés et protégés de tous les autres types. Cela est utile, par exemple, lors de l’écriture de code pour sérialiser des objets.

Notes

Pour la compatibilité descendante, ce constructeur demande SecurityPermission avec l’indicateur SecurityPermissionFlag.ControlEvidence si les conditions suivantes sont remplies : m est un module autre que le module appelant et que la demande pour ReflectionPermission avec l’indicateur ReflectionPermissionFlag.MemberAccess a échoué. Si la demande aboutit SecurityPermission , l’opération est autorisée.

Voir aussi

S’applique à

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

Source:
DynamicMethod.cs
Source:
DynamicMethod.cs
Source:
DynamicMethod.cs

Crée une méthode dynamique, en spécifiant le nom de la méthode, le type de retour, les types de paramètre, le type auquel la méthode dynamique est associée logiquement, et si les contrôles de visibilité juste-à-temps (JIT) doivent être ignorés pour les types et membres auxquels accède le langage MSIL (Microsoft Intermediate Language) de la méthode dynamique.

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)

Paramètres

name
String

Nom de la méthode dynamique. Il peut s’agir d’une chaîne de longueur nulle, mais pas de null.

returnType
Type

Objet Type qui spécifie le type de retour de la méthode dynamique, ou null si la méthode n’a aucun type de retour.

parameterTypes
Type[]

Tableau d’objets Type spécifiant les types des paramètres de la méthode dynamique, ou null si la méthode ne possède aucun paramètre.

owner
Type

Type avec lequel la méthode dynamique est logiquement associée. La méthode dynamique a accès à tous les membres du type.

skipVisibility
Boolean

true pour ignorer les contrôles de visibilité JIT sur les types et membres auxquels a accès le langage MSIL de la méthode dynamique ; sinon, false.

Exceptions

Un élément de parameterTypes a la valeur null ou Void.

- ou -

owner est une interface, un tableau, un type générique ouvert ou un paramètre de type d’un type générique ou d’une méthode.

name a la valeur null.

-ou-

owner a la valeur null.

.NET Framework et .NET Core versions antérieures à 2.1 : returnType est un type pour lequel IsByRef retourne true.

Remarques

La méthode dynamique créée avec ce constructeur a accès à tous les membres du type owner, et aux membres publics et internal (Friend en Visual Basic) de tous les autres types dans le module qui contient owner. Ignorer les vérifications de visibilité du compilateur JIT permet à la méthode dynamique d’accéder également aux membres privés et protégés de tous les autres types. Cela est utile, par exemple, lors de l’écriture de code pour sérialiser des objets.

Ce constructeur spécifie les attributs MethodAttributes.Public de méthode et MethodAttributes.Static, et la convention CallingConventions.Standardappelante .

Notes

Pour la compatibilité descendante, ce constructeur exige SecurityPermission l’indicateur SecurityPermissionFlag.ControlEvidence si les conditions suivantes sont remplies : owner se trouve dans un module autre que le module appelant et que la demande pour ReflectionPermission avec l’indicateur ReflectionPermissionFlag.MemberAccess a échoué. Si la demande aboutit SecurityPermission , l’opération est autorisée.

Voir aussi

S’applique à

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

Source:
DynamicMethod.cs
Source:
DynamicMethod.cs
Source:
DynamicMethod.cs

Crée une méthode dynamique qui est globale pour un module, en spécifiant le nom de la méthode, les attributs, les conventions d'appel, le type de retour, les types de paramètres, le module et si les contrôles de visibilité juste-à-temps (JIT) doivent être ignorés pour les types et membres auxquels accède le langage Microsoft Intermediate Language (MSIL) de la méthode dynamique.

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)

Paramètres

name
String

Nom de la méthode dynamique. Il peut s’agir d’une chaîne de longueur nulle, mais pas de null.

attributes
MethodAttributes

Combinaison de bits de valeurs MethodAttributes qui spécifie les attributs de la méthode dynamique. La seule combinaison autorisée est Public et Static.

callingConvention
CallingConventions

Convention d’appel de la méthode dynamique. Doit être Standard.

returnType
Type

Objet Type qui spécifie le type de retour de la méthode dynamique, ou null si la méthode n’a aucun type de retour.

parameterTypes
Type[]

Tableau d’objets Type spécifiant les types des paramètres de la méthode dynamique, ou null si la méthode ne possède aucun paramètre.

m
Module

Module représentant le module auquel la méthode dynamique doit être associée de manière logique.

skipVisibility
Boolean

true pour ignorer les contrôles de visibilité JIT sur les types et membres auxquels a accès le langage MSIL de la méthode dynamique ; sinon, false.

Exceptions

Un élément de parameterTypes a la valeur null ou Void.

- ou -

m est un module qui fournit l’hébergement anonyme pour les méthodes dynamiques.

name a la valeur null.

-ou-

m a la valeur null.

attributes est une combinaison d’indicateurs autre que Public et Static.

- ou -

callingConvention n’est pas un Standard.

- ou -

returnType est un type pour lequel IsByRef retourne true.

Remarques

La méthode dynamique créée avec ce constructeur a accès aux membres publics et internal (Friend en Visual Basic) de tous les types publics et internes contenus dans le module m.

Ignorer les vérifications de visibilité du compilateur JIT permet à la méthode dynamique d’accéder aux membres privés et protégés de tous les autres types dans le module et dans tous les autres assemblys. Cela est utile, par exemple, lors de l’écriture de code pour sérialiser des objets.

Notes

Pour la compatibilité descendante, ce constructeur demande SecurityPermission avec l’indicateur SecurityPermissionFlag.ControlEvidence si les conditions suivantes sont remplies : m est un module autre que le module appelant et que la demande pour ReflectionPermission avec l’indicateur ReflectionPermissionFlag.MemberAccess a échoué. Si la demande aboutit SecurityPermission , l’opération est autorisée.

Voir aussi

S’applique à

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

Source:
DynamicMethod.cs
Source:
DynamicMethod.cs
Source:
DynamicMethod.cs

Crée une méthode dynamique, en spécifiant le nom de la méthode, les attributs, la convention d’appel, le type de retour, les types de paramètre, le type auquel la méthode dynamique est associée logiquement, et si les contrôles de visibilité juste-à-temps (JIT) doivent être ignorés pour les types et membres auxquels accède le langage MSIL (Microsoft Intermediate Language) de la méthode dynamique.

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)

Paramètres

name
String

Nom de la méthode dynamique. Il peut s’agir d’une chaîne de longueur nulle, mais pas de null.

attributes
MethodAttributes

Combinaison de bits de valeurs MethodAttributes qui spécifie les attributs de la méthode dynamique. La seule combinaison autorisée est Public et Static.

callingConvention
CallingConventions

Convention d’appel de la méthode dynamique. Doit être Standard.

returnType
Type

Objet Type qui spécifie le type de retour de la méthode dynamique, ou null si la méthode n’a aucun type de retour.

parameterTypes
Type[]

Tableau d’objets Type spécifiant les types des paramètres de la méthode dynamique, ou null si la méthode ne possède aucun paramètre.

owner
Type

Type avec lequel la méthode dynamique est logiquement associée. La méthode dynamique a accès à tous les membres du type.

skipVisibility
Boolean

true pour ignorer les contrôles de visibilité JIT sur les types et membres auxquels a accès le langage MSIL de la méthode dynamique ; sinon, false.

Exceptions

Un élément de parameterTypes a la valeur null ou Void.

- ou -

owner est une interface, un tableau, un type générique ouvert ou un paramètre de type d’un type générique ou d’une méthode.

name a la valeur null.

-ou-

owner a la valeur null.

attributes est une combinaison d’indicateurs autre que Public et Static.

- ou -

callingConvention n’est pas un Standard.

- ou -

returnType est un type pour lequel IsByRef retourne true.

Remarques

La méthode dynamique est globale au module qui contient le type owner. Il a accès à tous les membres du type owner.

La méthode dynamique créée avec ce constructeur a accès à tous les membres du type owner, et aux membres publics et internal (Friend en Visual Basic) de tous les types contenus dans le module qui contient owner. Ignorer les vérifications de visibilité du compilateur JIT permet à la méthode dynamique d’accéder également aux membres privés et protégés de tous les autres types. Cela est utile, par exemple, lors de l’écriture de code pour sérialiser des objets.

Notes

Pour la compatibilité descendante, ce constructeur exige SecurityPermission l’indicateur SecurityPermissionFlag.ControlEvidence si les conditions suivantes sont remplies : owner se trouve dans un module autre que le module appelant et que la demande pour ReflectionPermission avec l’indicateur ReflectionPermissionFlag.MemberAccess a échoué. Si la demande aboutit SecurityPermission , l’opération est autorisée.

Voir aussi

S’applique à