DynamicMethod Constructors

Definitie

Hiermee maakt u een dynamische methode.

Overloads

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

Initialiseert een anoniem gehoste dynamische methode, waarbij de naam van de methode, het retourtype en de parametertypen worden opgegeven.

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

Initialiseert een anoniem gehoste dynamische methode, waarbij u de naam van de methode opgeeft, type retour, parametertypen en of JIT-zichtbaarheidscontroles (Just-In-Time) moeten worden overgeslagen voor typen en leden die worden geopend door de Microsoft tussentaal (MSIL) van de dynamische methode.

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

Hiermee maakt u een dynamische methode die globaal is voor een module, waarbij u de naam van de methode opgeeft, het retourtype, de parametertypen en de module opgeeft.

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

Hiermee maakt u een dynamische methode, geeft u de naam van de methode op, retourtype, parametertypen en het type waarmee de dynamische methode logisch is gekoppeld.

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

Hiermee maakt u een dynamische methode die globaal is voor een module, waarbij u de naam van de methode opgeeft, type, parametertypen, module en of JIT-zichtbaarheidscontroles (Just-In-Time) moeten worden overgeslagen voor typen en leden die worden geopend door de Microsoft tussentaal (MSIL) van de dynamische methode.

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

Hiermee maakt u een dynamische methode, waarbij u de methodenaam opgeeft, retourtype, parametertypen, het type waarmee de dynamische methode logisch is gekoppeld en of JIT-zichtbaarheidscontroles (Just-In-Time) moeten worden overgeslagen voor typen en leden die worden geopend door de Microsoft tussenliggende taal (MSIL) van de dynamische methode.

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

Hiermee maakt u een dynamische methode die globaal is voor een module, waarbij u de naam van de methode, kenmerken, aanroepconventie, retourtype, parametertypen, module en of JIT-zichtbaarheidscontroles (Just-In-Time) moeten worden overgeslagen voor typen en leden die worden geopend door de Microsoft tussentaal (MSIL) van de dynamische methode.

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

Hiermee maakt u een dynamische methode, waarbij u de naam van de methode, kenmerken, aanroepconventie, retourtype, parametertypen, het type waarmee de dynamische methode logisch is gekoppeld en of JIT-zichtbaarheidscontroles (Just-In-Time) moeten worden overgeslagen voor typen en leden die worden geopend door de Microsoft tussenliggende taal (MSIL) van de dynamische methode.

DynamicMethod(String, Type, Type[])

Initialiseert een anoniem gehoste dynamische methode, waarbij de naam van de methode, het retourtype en de parametertypen worden opgegeven.

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

Parameters

name
String

De naam van de dynamische methode. Dit kan een tekenreeks met lengte nul zijn, maar dit kan niet zijn null.

returnType
Type

Een Type object dat het retourtype van de dynamische methode aangeeft of null als de methode geen retourtype heeft.

parameterTypes
Type[]

Een matrix met Type objecten die de typen van de parameters van de dynamische methode opgeven, of null als de methode geen parameters heeft.

Uitzonderingen

Een element van parameterTypes is null of Void.

name is null.

.NET Framework en .NET Core-versies ouder dan 2.1: returnType is een type waarvoor IsByReftrue retourneert.

Opmerkingen

De dynamische methode die door deze constructor wordt gemaakt, is gekoppeld aan een anonieme assembly in plaats van een bestaand type of een bestaande module. De anonieme assembly bestaat alleen om een sandbox-omgeving te bieden voor dynamische methoden, dat wil gezegd, om ze te isoleren van andere code. Deze omgeving maakt het veilig voor de dynamische methode die wordt verzonden en uitgevoerd door gedeeltelijk vertrouwde code.

Deze constructor geeft aan dat JIT-zichtbaarheidscontroles (Just-In-Time) worden afgedwongen voor de Microsoft tussentaal (MSIL) van de dynamische methode. Dat wil gezegd: de code in de dynamische methode heeft toegang tot openbare methoden van openbare klassen. Er worden uitzonderingen gegenereerd als de methode probeert toegang te krijgen tot typen of leden die private, protected of internal (Friend in Visual Basic). Gebruik de DynamicMethod(String, Type, Type[], Boolean) constructor om een dynamische methode te maken die de mogelijkheid heeft om JIT-zichtbaarheidscontroles over te slaan.

Wanneer een anoniem gehoste dynamische methode wordt samengesteld, wordt de aanroepstack van de verzendende assembly opgenomen. Wanneer de methode wordt aangeroepen, worden de machtigingen van de verzendende assembly gebruikt in plaats van de machtigingen van de werkelijke aanroeper. De dynamische methode kan dus niet worden uitgevoerd op een hoger niveau van bevoegdheden dan die van de assembly die deze heeft verzonden, zelfs als deze wordt doorgegeven aan en uitgevoerd door een assembly met een hoger vertrouwensniveau.

Met deze constructor worden de methodekenmerken MethodAttributes.Public en MethodAttributes.Static, en de aanroepende conventie CallingConventions.Standardopgegeven.

Note

Deze constructor is geïntroduceerd in het .NET Framework 3.5 of hoger.

Zie ook

Van toepassing op

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

Initialiseert een anoniem gehoste dynamische methode, waarbij u de naam van de methode opgeeft, type retour, parametertypen en of JIT-zichtbaarheidscontroles (Just-In-Time) moeten worden overgeslagen voor typen en leden die worden geopend door de Microsoft tussentaal (MSIL) van de dynamische methode.

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

Parameters

name
String

De naam van de dynamische methode. Dit kan een tekenreeks met lengte nul zijn, maar dit kan niet zijn null.

returnType
Type

Een Type object dat het retourtype van de dynamische methode aangeeft of null als de methode geen retourtype heeft.

parameterTypes
Type[]

Een matrix met Type objecten die de typen van de parameters van de dynamische methode opgeven, of null als de methode geen parameters heeft.

restrictedSkipVisibility
Boolean

true om JIT-zichtbaarheidscontroles over te slaan op typen en leden die worden geopend door het MSIL van de dynamische methode, met deze beperking: het vertrouwensniveau van de assembly's die deze typen bevatten en leden moeten gelijk zijn aan of kleiner zijn dan het vertrouwensniveau van de aanroepstack die de dynamische methode verzendt; anders, false.

Uitzonderingen

Een element van parameterTypes is null of Void.

name is null.

.NET Framework en .NET Core-versies ouder dan 2.1: returnType is een type waarvoor IsByReftrue retourneert.

Opmerkingen

De dynamische methode die door deze constructor wordt gemaakt, is gekoppeld aan een anonieme assembly in plaats van een bestaand type of een bestaande module. De anonieme assembly bestaat alleen om een sandbox-omgeving te bieden voor dynamische methoden, dat wil gezegd, om ze te isoleren van andere code. Deze omgeving maakt het veilig voor de dynamische methode die wordt verzonden en uitgevoerd door gedeeltelijk vertrouwde code.

Anoniem gehoste dynamische methoden hebben geen automatische toegang tot typen of leden die private, protected of internal (Friend in Visual Basic). Dit verschilt van dynamische methoden die zijn gekoppeld aan een bestaand type of een bestaande module, die toegang hebben tot verborgen leden in het bijbehorende bereik.

Specificeer true voor restrictedSkipVisibility als uw dynamische methode toegang moet hebben tot typen of leden die private, protected, of internal zijn. Dit biedt de dynamische methode beperkte toegang tot deze leden. Dat wil zeggen: de leden kunnen alleen toegankelijk zijn als aan de volgende voorwaarden wordt voldaan.

  • De doelgroepen behoren tot een assemblage met een vertrouwensniveau dat gelijk is aan of lager is dan de aanroepstapel die de dynamische methode uitvoert.

  • De aanroepstack die de dynamische methode produceert, krijgt ReflectionPermission met de ReflectionPermissionFlag.RestrictedMemberAccess vlag. Dit geldt altijd wanneer de code wordt uitgevoerd met volledig vertrouwen. Voor gedeeltelijk vertrouwde code geldt dit alleen als de host expliciet de machtiging verleent.

    Important

    Als de machtiging niet is verleend, wordt er een beveiligingsonderzondering gegenereerd wanneer CreateDelegate deze wordt aangeroepen of wanneer de dynamische methode wordt aangeroepen, niet wanneer deze constructor wordt aangeroepen. Er zijn geen speciale machtigingen vereist om de dynamische methode te verzenden.

Een dynamische methode die is gemaakt met restrictedSkipVisibility ingesteld, true heeft bijvoorbeeld toegang tot een privélid van een assembly op de aanroepstack als aan de aanroepstack beperkte lidtoegang is verleend. Als de dynamische methode wordt gemaakt met gedeeltelijk vertrouwde code op de aanroepstack, heeft deze geen toegang tot een privélid van een type in een .NET Framework-assembly, omdat dergelijke assembly's volledig worden vertrouwd.

Als restrictedSkipVisibilityfalse is, worden JIT-zichtbaarheidscontroles afgedwongen. De code in de dynamische methode heeft toegang tot openbare methoden van openbare klassen en uitzonderingen worden opgegooid als wordt geprobeerd toegang te verkrijgen tot typen of leden die private, protected of internal.

Wanneer een anoniem gehoste dynamische methode wordt samengesteld, wordt de aanroepstack van de verzendende assembly opgenomen. Wanneer de methode wordt aangeroepen, worden de machtigingen van de aanroepstack voor het verzenden van aanroepen gebruikt in plaats van de machtigingen van de werkelijke aanroeper. De dynamische methode kan dus niet worden uitgevoerd op een hoger niveau van bevoegdheden dan die van de assembly die deze heeft verzonden, zelfs als deze wordt doorgegeven aan en uitgevoerd door een assembly met een hoger vertrouwensniveau.

Met deze constructor worden de methodekenmerken MethodAttributes.Public en MethodAttributes.Static, en de aanroepende conventie CallingConventions.Standardopgegeven.

Note

Deze constructor is geïntroduceerd in het .NET Framework 3.5 of hoger.

Zie ook

Van toepassing op

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

Hiermee maakt u een dynamische methode die globaal is voor een module, waarbij u de naam van de methode opgeeft, het retourtype, de parametertypen en de module opgeeft.

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

Parameters

name
String

De naam van de dynamische methode. Dit kan een tekenreeks met lengte nul zijn, maar dit kan niet zijn null.

returnType
Type

Een Type object dat het retourtype van de dynamische methode aangeeft of null als de methode geen retourtype heeft.

parameterTypes
Type[]

Een matrix met Type objecten die de typen van de parameters van de dynamische methode opgeven, of null als de methode geen parameters heeft.

m
Module

Een Module weergave van de module waarmee de dynamische methode logisch moet worden gekoppeld.

Uitzonderingen

Een element van parameterTypes is null of Void.

– of –

m is een module die anonieme hosting biedt voor dynamische methoden.

name is null.

– of –

m is null.

.NET Framework en .NET Core-versies ouder dan 2.1: returnType is een type waarvoor IsByReftrue retourneert.

Voorbeelden

In het volgende codevoorbeeld wordt een dynamische methode gemaakt die twee parameters gebruikt. In het voorbeeld wordt een eenvoudige functietekst verzonden waarmee de eerste parameter naar de console wordt afgedrukt. In het voorbeeld wordt de tweede parameter gebruikt als de retourwaarde van de methode. In het voorbeeld wordt de methode voltooid door een gemachtigde te maken, de gemachtigde aan te roepen met verschillende parameters en ten slotte de dynamische methode aan te roepen met behulp van de Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) methode.

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
'

Opmerkingen

Deze constructor specificeert methodekenmerken MethodAttributes.Public en MethodAttributes.Staticaanroepende conventie CallingConventions.Standarden slaat geen Just-In-Time (JIT)-zichtbaarheidscontroles over.

De dynamische methode die met deze constructor is gemaakt, heeft toegang tot publieke en internal (Friend in Visual Basic) leden van alle typen die in de module m zijn opgenomen.

Note

Voor compatibiliteit met eerdere versies vereist deze constructor SecurityPermission met de SecurityPermissionFlag.ControlEvidence vlag als aan de volgende voorwaarden is voldaan: m is een andere module dan de aanroepende module, en de eis voor ReflectionPermission met de ReflectionPermissionFlag.MemberAccess vlag is mislukt. Als de vraag naar SecurityPermission slaagt, is de bewerking toegestaan.

Zie ook

Van toepassing op

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

Hiermee maakt u een dynamische methode, geeft u de naam van de methode op, retourtype, parametertypen en het type waarmee de dynamische methode logisch is gekoppeld.

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

Parameters

name
String

De naam van de dynamische methode. Dit kan een tekenreeks met lengte nul zijn, maar dit kan niet zijn null.

returnType
Type

Een Type object dat het retourtype van de dynamische methode aangeeft of null als de methode geen retourtype heeft.

parameterTypes
Type[]

Een matrix met Type objecten die de typen van de parameters van de dynamische methode opgeven, of null als de methode geen parameters heeft.

owner
Type

Een Type methode waarmee de dynamische methode logisch is gekoppeld. De dynamische methode heeft toegang tot alle leden van het type.

Uitzonderingen

Een element van parameterTypes is null of Void.

– of –

owner is een interface, een matrix, een open algemeen type of een typeparameter van een algemeen type of methode.

name is null.

– of –

owner is null.

.NET Framework en .NET Core-versies ouder dan 2.1: returnType is een type waarvoor IsByReftrue retourneert.

Voorbeelden

In het volgende codevoorbeeld wordt een DynamicMethod logisch gekoppeld aan een type gemaakt. Deze associatie geeft het toegang tot de privéleden van dat type.

In het codevoorbeeld wordt een klasse gedefinieerd die is benoemd Example met een privéveld, een klasse DerivedFromExample die is afgeleid van de eerste klasse, een gemachtigdentype dat UseLikeStatic wordt geretourneerd Int32 en parameters van het type Example retourneert en Int32een gemachtigdentype dat UseLikeInstance retourneert Int32 en één parameter van het type Int32heeft.

De voorbeeldcode creëert een DynamicMethod die het privéveld van een instantie van Example verandert en de vorige waarde teruggeeft.

Note

Over het algemeen is het wijzigen van de interne velden van klassen geen goede objectgeoriënteerde coderingspraktijk.

De voorbeeldcode maakt een exemplaar van Example en maakt vervolgens twee gemachtigden. De eerste is van het type UseLikeStatic, dat dezelfde parameters heeft als de dynamische methode. De tweede is van het type UseLikeInstance, dat de eerste parameter (van het type Example) ontbreekt. Deze delegate wordt gemaakt met behulp van de CreateDelegate(Type, Object) methodeoverload; de tweede parameter van die methodeoverload is een exemplaar van Example, in dit geval het exemplaar dat zojuist is gemaakt, dat gebonden is aan de nieuw gemaakte delegate. Wanneer die gemachtigde wordt aangeroepen, handelt de dynamische methode op het afhankelijke exemplaar van Example.

Note

Dit is een voorbeeld van de versoepelde regels voor gedelegeerde binding die zijn geïntroduceerd in .NET Framework 2.0, samen met nieuwe overbelastingen van de Delegate.CreateDelegate methode. Zie de Delegate klas voor meer informatie.

De UseLikeStatic gemachtigde wordt aangeroepen, waarbij deze wordt doorgegeven aan het exemplaar van Example de UseLikeInstance gemachtigde. Vervolgens wordt de UseLikeInstance gedelegeerde aangeroepen, zodat beide gedelegeerden op dezelfde instantie van Example werken. De wijzigingen in de waarden van het interne veld worden na elke aanroep weergegeven. Ten slotte is een UseLikeInstance delegate gebonden aan een instantie van DerivedFromExample, en worden de delegate-oproepen herhaald.

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'

Opmerkingen

De dynamische methode die met deze constructor is gemaakt, heeft toegang tot alle leden van het type owner en tot openbare en internal (Friend in Visual Basic) leden van alle andere typen in de module die owner bevat.

Deze constructor specificeert methodekenmerken MethodAttributes.Public en MethodAttributes.Staticaanroepende conventie CallingConventions.Standarden slaat geen Just-In-Time (JIT)-zichtbaarheidscontroles over.

Note

Voor compatibiliteit met eerdere versies vereist deze constructor gebruik van SecurityPermission met de SecurityPermissionFlag.ControlEvidence vlag als aan de volgende voorwaarden is voldaan: owner bevindt zich in een andere module dan de aanroepende module en de eis dat ReflectionPermission met de ReflectionPermissionFlag.MemberAccess vlag is mislukt. Als de vraag naar SecurityPermission slaagt, is de bewerking toegestaan.

Zie ook

Van toepassing op

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

Hiermee maakt u een dynamische methode die globaal is voor een module, waarbij u de naam van de methode opgeeft, type, parametertypen, module en of JIT-zichtbaarheidscontroles (Just-In-Time) moeten worden overgeslagen voor typen en leden die worden geopend door de Microsoft tussentaal (MSIL) van de dynamische methode.

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

Parameters

name
String

De naam van de dynamische methode. Dit kan een tekenreeks met lengte nul zijn, maar dit kan niet zijn null.

returnType
Type

Een Type object dat het retourtype van de dynamische methode aangeeft of null als de methode geen retourtype heeft.

parameterTypes
Type[]

Een matrix met Type objecten die de typen van de parameters van de dynamische methode opgeven, of null als de methode geen parameters heeft.

m
Module

Een Module weergave van de module waarmee de dynamische methode logisch moet worden gekoppeld.

skipVisibility
Boolean

true om JIT-zichtbaarheidscontroles over te slaan op typen en leden die worden geopend door de MSIL van de dynamische methode.

Uitzonderingen

Een element van parameterTypes is null of Void.

– of –

m is een module die anonieme hosting biedt voor dynamische methoden.

name is null.

– of –

m is null.

.NET Framework en .NET Core-versies ouder dan 2.1: returnType is een type waarvoor IsByReftrue retourneert.

Opmerkingen

Met deze constructor worden methodekenmerken MethodAttributes.Public en MethodAttributes.Static, en aanroepende conventie CallingConventions.Standardopgegeven.

De dynamische methode die met deze constructor is gemaakt, heeft toegang tot openbare en internal (Friend in Visual Basic) leden van alle typen ingesloten module m. Door de zichtbaarheidscontroles van de JIT-compiler over te slaan, heeft de dynamische methode ook toegang tot privé- en beveiligde leden van alle andere typen. Dit is bijvoorbeeld handig bij het schrijven van code om objecten te serialiseren.

Note

Voor compatibiliteit met eerdere versies vereist deze constructor SecurityPermission met de SecurityPermissionFlag.ControlEvidence vlag als aan de volgende voorwaarden is voldaan: m is een andere module dan de aanroepende module, en de eis voor ReflectionPermission met de ReflectionPermissionFlag.MemberAccess vlag is mislukt. Als de vraag naar SecurityPermission slaagt, is de bewerking toegestaan.

Zie ook

Van toepassing op

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

Hiermee maakt u een dynamische methode, waarbij u de methodenaam opgeeft, retourtype, parametertypen, het type waarmee de dynamische methode logisch is gekoppeld en of JIT-zichtbaarheidscontroles (Just-In-Time) moeten worden overgeslagen voor typen en leden die worden geopend door de Microsoft tussenliggende taal (MSIL) van de dynamische methode.

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

Parameters

name
String

De naam van de dynamische methode. Dit kan een tekenreeks met lengte nul zijn, maar dit kan niet zijn null.

returnType
Type

Een Type object dat het retourtype van de dynamische methode aangeeft of null als de methode geen retourtype heeft.

parameterTypes
Type[]

Een matrix met Type objecten die de typen van de parameters van de dynamische methode opgeven, of null als de methode geen parameters heeft.

owner
Type

Een Type methode waarmee de dynamische methode logisch is gekoppeld. De dynamische methode heeft toegang tot alle leden van het type.

skipVisibility
Boolean

true om JIT-zichtbaarheidscontroles over te slaan op typen en leden die worden geopend door de MSIL van de dynamische methode; anders, false.

Uitzonderingen

Een element van parameterTypes is null of Void.

– of –

owner is een interface, een matrix, een open algemeen type of een typeparameter van een algemeen type of methode.

name is null.

– of –

owner is null.

.NET Framework en .NET Core-versies ouder dan 2.1: returnType is een type waarvoor IsByReftrue retourneert.

Opmerkingen

De dynamische methode die met deze constructor is gemaakt, heeft toegang tot alle leden van het type owner en tot openbare en internal (Friend in Visual Basic) leden van alle andere typen in de module die owner bevat. Door de zichtbaarheidscontroles van de JIT-compiler over te slaan, heeft de dynamische methode ook toegang tot privé- en beveiligde leden van alle andere typen. Dit is bijvoorbeeld handig bij het schrijven van code om objecten te serialiseren.

Met deze constructor worden methodekenmerken MethodAttributes.Public en MethodAttributes.Static, en aanroepende conventie CallingConventions.Standardopgegeven.

Note

Voor compatibiliteit met eerdere versies vereist deze constructor gebruik van SecurityPermission met de SecurityPermissionFlag.ControlEvidence vlag als aan de volgende voorwaarden is voldaan: owner bevindt zich in een andere module dan de aanroepende module en de eis dat ReflectionPermission met de ReflectionPermissionFlag.MemberAccess vlag is mislukt. Als de vraag naar SecurityPermission slaagt, is de bewerking toegestaan.

Zie ook

Van toepassing op

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

Hiermee maakt u een dynamische methode die globaal is voor een module, waarbij u de naam van de methode, kenmerken, aanroepconventie, retourtype, parametertypen, module en of JIT-zichtbaarheidscontroles (Just-In-Time) moeten worden overgeslagen voor typen en leden die worden geopend door de Microsoft tussentaal (MSIL) van de dynamische methode.

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

Parameters

name
String

De naam van de dynamische methode. Dit kan een tekenreeks met lengte nul zijn, maar dit kan niet zijn null.

attributes
MethodAttributes

Een bitsgewijze combinatie van MethodAttributes waarden waarmee de kenmerken van de dynamische methode worden opgegeven. De enige toegestane combinatie is Public en Static.

callingConvention
CallingConventions

De aanroepconventie voor de dynamische methode. Moet Standardzijn.

returnType
Type

Een Type object dat het retourtype van de dynamische methode aangeeft of null als de methode geen retourtype heeft.

parameterTypes
Type[]

Een matrix met Type objecten die de typen van de parameters van de dynamische methode opgeven, of null als de methode geen parameters heeft.

m
Module

Een Module weergave van de module waarmee de dynamische methode logisch moet worden gekoppeld.

skipVisibility
Boolean

true om JIT-zichtbaarheidscontroles over te slaan op typen en leden die worden geopend door de MSIL van de dynamische methode; anders, false.

Uitzonderingen

Een element van parameterTypes is null of Void.

– of –

m is een module die anonieme hosting biedt voor dynamische methoden.

name is null.

– of –

m is null.

attributes is een combinatie van andere vlaggen dan Public en Static.

– of –

callingConvention is niet Standard.

– of –

returnType is een type waarvoor IsByRef wordt geretourneerd true.

Opmerkingen

De dynamische methode die met deze constructor is gemaakt, heeft toegang tot openbare en internal (Friend in Visual Basic) leden van alle openbare en interne typen in module m.

Door de zichtbaarheidscontroles van de JIT-compiler over te slaan, heeft de dynamische methode toegang tot privé- en beveiligde leden van alle andere typen in de module en in alle andere assembly's. Dit is bijvoorbeeld handig bij het schrijven van code om objecten te serialiseren.

Note

Voor compatibiliteit met eerdere versies vereist deze constructor SecurityPermission met de SecurityPermissionFlag.ControlEvidence vlag als aan de volgende voorwaarden is voldaan: m is een andere module dan de aanroepende module, en de eis voor ReflectionPermission met de ReflectionPermissionFlag.MemberAccess vlag is mislukt. Als de vraag naar SecurityPermission slaagt, is de bewerking toegestaan.

Zie ook

Van toepassing op

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

Hiermee maakt u een dynamische methode, waarbij u de naam van de methode, kenmerken, aanroepconventie, retourtype, parametertypen, het type waarmee de dynamische methode logisch is gekoppeld en of JIT-zichtbaarheidscontroles (Just-In-Time) moeten worden overgeslagen voor typen en leden die worden geopend door de Microsoft tussenliggende taal (MSIL) van de dynamische methode.

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

Parameters

name
String

De naam van de dynamische methode. Dit kan een tekenreeks met lengte nul zijn, maar dit kan niet zijn null.

attributes
MethodAttributes

Een bitsgewijze combinatie van MethodAttributes waarden waarmee de kenmerken van de dynamische methode worden opgegeven. De enige toegestane combinatie is Public en Static.

callingConvention
CallingConventions

De aanroepconventie voor de dynamische methode. Moet Standardzijn.

returnType
Type

Een Type object dat het retourtype van de dynamische methode aangeeft of null als de methode geen retourtype heeft.

parameterTypes
Type[]

Een matrix met Type objecten die de typen van de parameters van de dynamische methode opgeven, of null als de methode geen parameters heeft.

owner
Type

Een Type methode waarmee de dynamische methode logisch is gekoppeld. De dynamische methode heeft toegang tot alle leden van het type.

skipVisibility
Boolean

true om JIT-zichtbaarheidscontroles over te slaan op typen en leden die worden geopend door de MSIL van de dynamische methode; anders, false.

Uitzonderingen

Een element van parameterTypes is null of Void.

– of –

owner is een interface, een matrix, een open algemeen type of een typeparameter van een algemeen type of methode.

name is null.

– of –

owner is null.

attributes is een combinatie van andere vlaggen dan Public en Static.

– of –

callingConvention is niet Standard.

– of –

returnType is een type waarvoor IsByRef wordt geretourneerd true.

Opmerkingen

De dynamische methode is globaal voor de module die het type ownerbevat. Het heeft toegang tot alle leden van het type owner.

De dynamische methode die met deze constructor is gemaakt, heeft toegang tot alle leden van het type owner en tot openbare en internal (Friend in Visual Basic) leden van alle typen die zijn opgenomen in de module die owner bevat. Door de zichtbaarheidscontroles van de JIT-compiler over te slaan, heeft de dynamische methode ook toegang tot privé- en beveiligde leden van alle andere typen. Dit is bijvoorbeeld handig bij het schrijven van code om objecten te serialiseren.

Note

Voor compatibiliteit met eerdere versies vereist deze constructor gebruik van SecurityPermission met de SecurityPermissionFlag.ControlEvidence vlag als aan de volgende voorwaarden is voldaan: owner bevindt zich in een andere module dan de aanroepende module en de eis dat ReflectionPermission met de ReflectionPermissionFlag.MemberAccess vlag is mislukt. Als de vraag naar SecurityPermission slaagt, is de bewerking toegestaan.

Zie ook

Van toepassing op