DynamicMethod Konstruktorer

Definition

Skapar en dynamisk metod.

Överlagringar

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

Initierar en anonymt värdbaserad dynamisk metod som anger metodnamn, returtyp och parametertyper.

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

Initierar en anonymt värdbaserad dynamisk metod som anger metodnamn, returtyp, parametertyper och om jit-synlighetskontroller (just-in-time) ska hoppas över för typer och medlemmar som används av Microsoft mellanliggande språk (MSIL) för den dynamiska metoden.

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

Skapar en dynamisk metod som är global för en modul och anger metodnamnet, returtypen, parametertyperna och modulen.

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

Skapar en dynamisk metod som anger metodnamnet, returtypen, parametertyperna och den typ som den dynamiska metoden är logiskt associerad med.

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

Skapar en dynamisk metod som är global för en modul, som anger metodnamn, returtyp, parametertyper, modul och om jit-synlighetskontroller (just-in-time) ska hoppas över för typer och medlemmar som används av Microsoft mellanliggande språk (MSIL) för den dynamiska metoden.

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

Skapar en dynamisk metod som anger metodnamnet, returtypen, parametertyperna, typen som den dynamiska metoden är logiskt associerad med och om jit-synlighetskontroller (just-in-time) ska hoppas över för typer och medlemmar som används av den dynamiska metodens Microsoft mellanliggande språk (MSIL).

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

Skapar en dynamisk metod som är global för en modul och anger metodnamn, attribut, anropande konvention, returtyp, parametertyper, modul och om jit-synlighetskontroller (just-in-time) ska hoppas över för typer och medlemmar som används av den dynamiska metodens Microsoft mellanliggande språk (MSIL).

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

Skapar en dynamisk metod som anger metodens namn, attribut, anropar konvention, returtyp, parametertyper, den typ som den dynamiska metoden är logiskt associerad med och om jit-synlighetskontroller (just-in-time) ska hoppas över för typer och medlemmar som används av den dynamiska metodens Microsoft mellanliggande språk (MSIL).

DynamicMethod(String, Type, Type[])

Initierar en anonymt värdbaserad dynamisk metod som anger metodnamn, returtyp och parametertyper.

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

Parametrar

name
String

Namnet på den dynamiska metoden. Det kan vara en sträng med noll längd, men det kan inte vara null.

returnType
Type

Ett Type objekt som anger returtypen för den dynamiska metoden eller null om metoden inte har någon returtyp.

parameterTypes
Type[]

En matris med Type objekt som anger typerna av parametrarna för den dynamiska metoden, eller null om metoden inte har några parametrar.

Undantag

Ett element i parameterTypes är null eller Void.

name är null.

.NET Framework- och .NET Core-versioner som är äldre än 2.1: returnType är en typ som IsByRef returnerar true.

Kommentarer

Den dynamiska metod som skapas av den här konstruktorn är associerad med en anonym sammansättning i stället för en befintlig typ eller modul. Den anonyma sammansättningen finns bara för att tillhandahålla en sandbox-miljö för dynamiska metoder, dvs. för att isolera dem från annan kod. Den här miljön gör det säkert för den dynamiska metoden att genereras och köras av delvis betrodd kod.

Den här konstruktorn anger att jit-synlighetskontroller (just-in-time) tillämpas för den dynamiska metodens Microsoft mellanliggande språk (MSIL). Koden i den dynamiska metoden har alltså åtkomst till offentliga metoder för offentliga klasser. Undantag utlöses om metoden försöker komma åt typer eller medlemmar som är private, protected eller internal (Friend i Visual Basic). Om du vill skapa en dynamisk metod som har begränsad möjlighet att hoppa över JIT-synlighetskontroller använder du DynamicMethod(String, Type, Type[], Boolean) konstruktorn.

När en anonymt värdbaserad dynamisk metod skapas inkluderas anropsstacken för den utsändande sammansättningen. När metoden anropas används behörigheterna för den sändande sammansättningen i stället för den faktiska anroparens behörigheter. Den dynamiska metoden kan därför inte köras på en högre behörighetsnivå än den sammansättning som skickade den, även om den skickas till och körs av en sammansättning som har en högre förtroendenivå.

Den här konstruktorn anger metodattributen MethodAttributes.Public och MethodAttributes.Static, och anropskonventionen CallingConventions.Standard.

Note

Konstruktorn introducerades i .NET Framework 3.5 eller senare.

Se även

Gäller för

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

Initierar en anonymt värdbaserad dynamisk metod som anger metodnamn, returtyp, parametertyper och om jit-synlighetskontroller (just-in-time) ska hoppas över för typer och medlemmar som används av Microsoft mellanliggande språk (MSIL) för den dynamiska metoden.

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)

Parametrar

name
String

Namnet på den dynamiska metoden. Det kan vara en sträng med noll längd, men det kan inte vara null.

returnType
Type

Ett Type objekt som anger returtypen för den dynamiska metoden eller null om metoden inte har någon returtyp.

parameterTypes
Type[]

En matris med Type objekt som anger typerna av parametrarna för den dynamiska metoden, eller null om metoden inte har några parametrar.

restrictedSkipVisibility
Boolean

trueför att hoppa över JIT-synlighetskontroller på typer och medlemmar som används av MSIL för den dynamiska metoden, med den här begränsningen: förtroendenivån för de sammansättningar som innehåller dessa typer och medlemmar måste vara lika med eller mindre än förtroendenivån för anropsstacken som genererar den dynamiska metoden; annars . false

Undantag

Ett element i parameterTypes är null eller Void.

name är null.

.NET Framework- och .NET Core-versioner som är äldre än 2.1: returnType är en typ som IsByRef returnerar true.

Kommentarer

Den dynamiska metod som skapas av den här konstruktorn är associerad med en anonym sammansättning i stället för en befintlig typ eller modul. Den anonyma sammansättningen finns bara för att tillhandahålla en sandbox-miljö för dynamiska metoder, dvs. för att isolera dem från annan kod. Den här miljön gör det säkert för den dynamiska metoden att genereras och köras av delvis betrodd kod.

Anonymt värdbaserade dynamiska metoder har inte automatisk åtkomst till några typer eller medlemmar som är private, protected eller internal (Friend i Visual Basic). Detta skiljer sig från dynamiska metoder som är associerade med en befintlig typ eller modul, som har åtkomst till dolda medlemmar i deras associerade omfång.

Ange true för restrictedSkipVisibility om din dynamiska metod måste komma åt typer eller medlemmar som är private, protectedeller internal. Detta ger den dynamiska metoden begränsad åtkomst till dessa medlemmar. Det vill: medlemmarna kan endast nås om följande villkor uppfylls:

  • Målmedlemmarna tillhör en sammansättning som har en förtroendenivå som är lika med eller lägre än den anropsstack som genererar den dynamiska metoden.

  • Anropsstacken som genererar den dynamiska metoden beviljas ReflectionPermission med flaggan ReflectionPermissionFlag.RestrictedMemberAccess. Detta är alltid sant när koden körs med fullständigt förtroende. För delvis betrodd kod är det bara sant om värden uttryckligen beviljar behörigheten.

    Important

    Om behörigheten inte har beviljats utlöses ett säkerhetsfel när CreateDelegate anropas eller när den dynamiska metoden anropas, inte när konstruktorn anropas. Inga särskilda behörigheter krävs för att generera den dynamiska metoden.

En dynamisk metod som skapas med restrictedSkipVisibility inställd på true kan till exempel komma åt en privat medlem i valfri sammansättning i anropsstacken om anropsstacken har beviljats begränsad medlemsåtkomst. Om den dynamiska metoden skapas med delvis betrodd kod i anropsstacken kan den inte komma åt en privat medlem av en typ i en .NET Framework-sammansättning, eftersom sådana sammansättningar är fullständigt betrodda.

Om restrictedSkipVisibility är falsetillämpas JIT-synlighetskontroller. Koden i den dynamiska metoden har åtkomst till offentliga metoder för offentliga klasser och undantag utlöses om den försöker komma åt typer eller medlemmar som är private, protectedeller internal.

När en anonymt värdbaserad dynamisk metod skapas inkluderas anropsstacken för den utsändande sammansättningen. När metoden anropas används behörigheterna för den sändande anropsstacken i stället för den faktiska anroparens behörigheter. Den dynamiska metoden kan därför inte köras på en högre behörighetsnivå än den sammansättning som skickade den, även om den skickas till och körs av en sammansättning som har en högre förtroendenivå.

Den här konstruktorn anger metodattributen MethodAttributes.Public och MethodAttributes.Static, och anropskonventionen CallingConventions.Standard.

Note

Konstruktorn introducerades i .NET Framework 3.5 eller senare.

Se även

Gäller för

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

Skapar en dynamisk metod som är global för en modul och anger metodnamnet, returtypen, parametertyperna och modulen.

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)

Parametrar

name
String

Namnet på den dynamiska metoden. Det kan vara en sträng med noll längd, men det kan inte vara null.

returnType
Type

Ett Type objekt som anger returtypen för den dynamiska metoden eller null om metoden inte har någon returtyp.

parameterTypes
Type[]

En matris med Type objekt som anger typerna av parametrarna för den dynamiska metoden, eller null om metoden inte har några parametrar.

m
Module

En Module som representerar modulen som den dynamiska metoden ska associeras logiskt med.

Undantag

Ett element i parameterTypes är null eller Void.

-eller-

m är en modul som tillhandahåller anonym värd för dynamiska metoder.

name är null.

-eller-

m är null.

.NET Framework- och .NET Core-versioner som är äldre än 2.1: returnType är en typ som IsByRef returnerar true.

Exempel

I följande kodexempel skapas en dynamisk metod som tar två parametrar. Exemplet genererar en enkel funktionstext som skriver ut den första parametern till konsolen, och i exemplet används den andra parametern som returvärde för metoden. Exemplet slutför metoden genom att skapa ett ombud, anropar ombudet med olika parametrar och anropar slutligen den dynamiska metoden med hjälp av Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) metoden.

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
'

Kommentarer

Den här konstruktorn anger metodattribut MethodAttributes.Public och MethodAttributes.Static, anropar konvention CallingConventions.Standardoch hoppar inte över jit-synlighetskontroller (just-in-time).

Den dynamiska metoden som skapas med den här konstruktorn har åtkomst till offentliga och internal (Friend i Visual Basic) medlemmar av alla typer som ingår i modulen m.

Note

För bakåtkompatibilitet kräver den här konstruktorn SecurityPermission med SecurityPermissionFlag.ControlEvidence-flagga om båda följande villkor är uppfyllda: m är en annan modul än den modul som anropar, och kravet på ReflectionPermission med ReflectionPermissionFlag.MemberAccess-flagga har misslyckats. Om efterfrågan på SecurityPermission blir framgångsrik tillåts operationen.

Se även

Gäller för

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

Skapar en dynamisk metod som anger metodnamnet, returtypen, parametertyperna och den typ som den dynamiska metoden är logiskt associerad med.

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)

Parametrar

name
String

Namnet på den dynamiska metoden. Det kan vara en sträng med noll längd, men det kan inte vara null.

returnType
Type

Ett Type objekt som anger returtypen för den dynamiska metoden eller null om metoden inte har någon returtyp.

parameterTypes
Type[]

En matris med Type objekt som anger typerna av parametrarna för den dynamiska metoden, eller null om metoden inte har några parametrar.

owner
Type

En Type som den dynamiska metoden är logiskt associerad med. Den dynamiska metoden har åtkomst till alla medlemmar av typen.

Undantag

Ett element i parameterTypes är null eller Void.

-eller-

owner är ett gränssnitt, en matris, en öppen allmän typ eller en typparameter av en allmän typ eller metod.

name är null.

-eller-

owner är null.

.NET Framework- och .NET Core-versioner som är äldre än 2.1: returnType är en typ som IsByRef returnerar true.

Exempel

I följande kodexempel skapas en DynamicMethod som är logiskt associerad med en typ. Den här associationen ger den åtkomst till de privata medlemmarna av den typen.

Kodexemplet definierar en klass med namnet Example med ett privat fält, en klass med namnet DerivedFromExample som härleds från den första klassen, en ombudstyp med namnet UseLikeStatic som returnerar Int32 och har parametrar av typen Example och Int32, och en ombudstyp med namnet UseLikeInstance som returnerar Int32 och har en parameter av typen Int32.

Exempelkoden skapar sedan en DynamicMethod som ändrar det privata fältet för en instans av Example och returnerar det tidigare värdet.

Note

I allmänhet är det inte bra objektorienterad kodning att ändra de interna fälten i klasser.

Exempelkoden skapar en instans av Example och skapar sedan två ombud. Den första är av typen UseLikeStatic, som har samma parametrar som den dynamiska metoden. Den andra är av typen UseLikeInstance, som saknar den första parametern (av typen Example). Den här delegeringen skapas med hjälp av metodöverlagringen CreateDelegate(Type, Object); den andra parametern för den metodöverlagringen är en instans av Example, i det här fallet den instans som just har skapats, som är bunden till den nyligen skapade delegeringen. När den delegerade anropas agerar den dynamiska metoden på den bundna instansen av Example.

Note

Det här är ett exempel på de avslappnade reglerna för delegatbindning som introducerades i .NET Framework 2.0, tillsammans med nya överlagringar av Delegate.CreateDelegate metoden. Mer information finns i Delegate klassen .

Ombudet UseLikeStatic anropas och skickar in den instans av Example som är bunden till ombudet UseLikeInstance . Sedan anropas delegeraren UseLikeInstance så att båda delegerarna agerar på samma instans av Example. Ändringarna i värdena för det interna fältet visas efter varje anrop. Slutligen är en UseLikeInstance delegat bunden till en instans av DerivedFromExample, och delegatanropen upprepas.

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'

Kommentarer

Den dynamiska metoden som skapas med den här konstruktorn har åtkomst till alla medlemmar av typen owner, och till offentliga och internal (Friend i Visual Basic) medlemmar av alla andra typer i modulen som innehåller owner.

Den här konstruktorn anger metodattribut MethodAttributes.Public och MethodAttributes.Static, anropar konvention CallingConventions.Standardoch hoppar inte över jit-synlighetskontroller (just-in-time).

Note

För bakåtkompatibilitet kräver denna konstruktor SecurityPermission med flaggan SecurityPermissionFlag.ControlEvidence om följande villkor är uppfyllda: owner finns i en annan modul än den som anropar och kravet på ReflectionPermission med flaggan ReflectionPermissionFlag.MemberAccess har misslyckats. Om efterfrågan på SecurityPermission blir framgångsrik tillåts operationen.

Se även

Gäller för

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

Skapar en dynamisk metod som är global för en modul, som anger metodnamn, returtyp, parametertyper, modul och om jit-synlighetskontroller (just-in-time) ska hoppas över för typer och medlemmar som används av Microsoft mellanliggande språk (MSIL) för den dynamiska metoden.

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)

Parametrar

name
String

Namnet på den dynamiska metoden. Det kan vara en sträng med noll längd, men det kan inte vara null.

returnType
Type

Ett Type objekt som anger returtypen för den dynamiska metoden eller null om metoden inte har någon returtyp.

parameterTypes
Type[]

En matris med Type objekt som anger typerna av parametrarna för den dynamiska metoden, eller null om metoden inte har några parametrar.

m
Module

En Module som representerar modulen som den dynamiska metoden ska associeras logiskt med.

skipVisibility
Boolean

true för att hoppa över JIT-synlighetskontroller på typer och medlemmar som används av MSIL för den dynamiska metoden.

Undantag

Ett element i parameterTypes är null eller Void.

-eller-

m är en modul som tillhandahåller anonym värd för dynamiska metoder.

name är null.

-eller-

m är null.

.NET Framework- och .NET Core-versioner som är äldre än 2.1: returnType är en typ som IsByRef returnerar true.

Kommentarer

Den här konstruktorn anger metodattribut MethodAttributes.Public och MethodAttributes.Static, och anropande konvention CallingConventions.Standard.

Den dynamiska metod som skapas med den här konstruktorn har åtkomst till offentliga och internal (Friend i Visual Basic) medlemmar av alla typer i den inneslutna modulen m. Genom att hoppa över JIT-kompilatorns synlighetskontroller kan den dynamiska metoden även komma åt privata och skyddade medlemmar av alla andra typer. Detta är till exempel användbart när du skriver kod för att serialisera objekt.

Note

För bakåtkompatibilitet kräver den här konstruktorn SecurityPermission med SecurityPermissionFlag.ControlEvidence-flagga om båda följande villkor är uppfyllda: m är en annan modul än den modul som anropar, och kravet på ReflectionPermission med ReflectionPermissionFlag.MemberAccess-flagga har misslyckats. Om efterfrågan på SecurityPermission blir framgångsrik tillåts operationen.

Se även

Gäller för

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

Skapar en dynamisk metod som anger metodnamnet, returtypen, parametertyperna, typen som den dynamiska metoden är logiskt associerad med och om jit-synlighetskontroller (just-in-time) ska hoppas över för typer och medlemmar som används av den dynamiska metodens Microsoft mellanliggande språk (MSIL).

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)

Parametrar

name
String

Namnet på den dynamiska metoden. Det kan vara en sträng med noll längd, men det kan inte vara null.

returnType
Type

Ett Type objekt som anger returtypen för den dynamiska metoden eller null om metoden inte har någon returtyp.

parameterTypes
Type[]

En matris med Type objekt som anger typerna av parametrarna för den dynamiska metoden, eller null om metoden inte har några parametrar.

owner
Type

En Type som den dynamiska metoden är logiskt associerad med. Den dynamiska metoden har åtkomst till alla medlemmar av typen.

skipVisibility
Boolean

trueför att hoppa över JIT-synlighetskontroller på typer och medlemmar som används av MSIL för den dynamiska metoden; annars . false

Undantag

Ett element i parameterTypes är null eller Void.

-eller-

owner är ett gränssnitt, en matris, en öppen allmän typ eller en typparameter av en allmän typ eller metod.

name är null.

-eller-

owner är null.

.NET Framework- och .NET Core-versioner som är äldre än 2.1: returnType är en typ som IsByRef returnerar true.

Kommentarer

Den dynamiska metoden som skapas med den här konstruktorn har åtkomst till alla medlemmar av typen owner, och till offentliga och internal (Friend i Visual Basic) medlemmar av alla andra typer i modulen som innehåller owner. Genom att hoppa över JIT-kompilatorns synlighetskontroller kan den dynamiska metoden även komma åt privata och skyddade medlemmar av alla andra typer. Detta är till exempel användbart när du skriver kod för att serialisera objekt.

Den här konstruktorn anger metodattribut MethodAttributes.Public och MethodAttributes.Static, och anropande konvention CallingConventions.Standard.

Note

För bakåtkompatibilitet kräver denna konstruktor SecurityPermission med flaggan SecurityPermissionFlag.ControlEvidence om följande villkor är uppfyllda: owner finns i en annan modul än den som anropar och kravet på ReflectionPermission med flaggan ReflectionPermissionFlag.MemberAccess har misslyckats. Om efterfrågan på SecurityPermission blir framgångsrik tillåts operationen.

Se även

Gäller för

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

Skapar en dynamisk metod som är global för en modul och anger metodnamn, attribut, anropande konvention, returtyp, parametertyper, modul och om jit-synlighetskontroller (just-in-time) ska hoppas över för typer och medlemmar som används av den dynamiska metodens Microsoft mellanliggande språk (MSIL).

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)

Parametrar

name
String

Namnet på den dynamiska metoden. Det kan vara en sträng med noll längd, men det kan inte vara null.

attributes
MethodAttributes

En bitvis kombination av MethodAttributes värden som anger attributen för den dynamiska metoden. Den enda tillåtna kombinationen är Public och Static.

callingConvention
CallingConventions

Anropskonventionen för den dynamiska metoden. Måste vara Standard.

returnType
Type

Ett Type objekt som anger returtypen för den dynamiska metoden eller null om metoden inte har någon returtyp.

parameterTypes
Type[]

En matris med Type objekt som anger typerna av parametrarna för den dynamiska metoden, eller null om metoden inte har några parametrar.

m
Module

En Module som representerar modulen som den dynamiska metoden ska associeras logiskt med.

skipVisibility
Boolean

trueför att hoppa över JIT-synlighetskontroller på typer och medlemmar som används av MSIL för den dynamiska metoden; annars . false

Undantag

Ett element i parameterTypes är null eller Void.

-eller-

m är en modul som tillhandahåller anonym värd för dynamiska metoder.

name är null.

-eller-

m är null.

attributes är en kombination av andra flaggor än Public och Static.

-eller-

callingConvention är inte Standard.

-eller-

returnType är en typ som IsByRef returnerar true.

Kommentarer

Den dynamiska metod som skapas med den här konstruktorn har åtkomst till offentliga och internal (Friend i Visual Basic) medlemmar av alla offentliga och interna typer som finns i modulen m.

Om du hoppar över JIT-kompilatorns synlighetskontroller kan den dynamiska metoden komma åt privata och skyddade medlemmar av alla andra typer i modulen och i alla andra sammansättningar. Detta är till exempel användbart när du skriver kod för att serialisera objekt.

Note

För bakåtkompatibilitet kräver den här konstruktorn SecurityPermission med SecurityPermissionFlag.ControlEvidence-flagga om båda följande villkor är uppfyllda: m är en annan modul än den modul som anropar, och kravet på ReflectionPermission med ReflectionPermissionFlag.MemberAccess-flagga har misslyckats. Om efterfrågan på SecurityPermission blir framgångsrik tillåts operationen.

Se även

Gäller för

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

Skapar en dynamisk metod som anger metodens namn, attribut, anropar konvention, returtyp, parametertyper, den typ som den dynamiska metoden är logiskt associerad med och om jit-synlighetskontroller (just-in-time) ska hoppas över för typer och medlemmar som används av den dynamiska metodens Microsoft mellanliggande språk (MSIL).

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)

Parametrar

name
String

Namnet på den dynamiska metoden. Det kan vara en sträng med noll längd, men det kan inte vara null.

attributes
MethodAttributes

En bitvis kombination av MethodAttributes värden som anger attributen för den dynamiska metoden. Den enda tillåtna kombinationen är Public och Static.

callingConvention
CallingConventions

Anropskonventionen för den dynamiska metoden. Måste vara Standard.

returnType
Type

Ett Type objekt som anger returtypen för den dynamiska metoden eller null om metoden inte har någon returtyp.

parameterTypes
Type[]

En matris med Type objekt som anger typerna av parametrarna för den dynamiska metoden, eller null om metoden inte har några parametrar.

owner
Type

En Type som den dynamiska metoden är logiskt associerad med. Den dynamiska metoden har åtkomst till alla medlemmar av typen.

skipVisibility
Boolean

trueför att hoppa över JIT-synlighetskontroller på typer och medlemmar som används av MSIL för den dynamiska metoden; annars . false

Undantag

Ett element i parameterTypes är null eller Void.

-eller-

owner är ett gränssnitt, en matris, en öppen allmän typ eller en typparameter av en allmän typ eller metod.

name är null.

-eller-

owner är null.

attributes är en kombination av andra flaggor än Public och Static.

-eller-

callingConvention är inte Standard.

-eller-

returnType är en typ som IsByRef returnerar true.

Kommentarer

Den dynamiska metoden är global för modulen som innehåller typen owner. Den har åtkomst till alla medlemmar av typen owner.

Den dynamiska metod som skapas med den här konstruktorn har åtkomst till alla medlemmar av typen owner och till medlemmar i offentliga och internal (Friend i Visual Basic) av alla typer som finns i modulen som innehåller owner. Genom att hoppa över JIT-kompilatorns synlighetskontroller kan den dynamiska metoden även komma åt privata och skyddade medlemmar av alla andra typer. Detta är till exempel användbart när du skriver kod för att serialisera objekt.

Note

För bakåtkompatibilitet kräver denna konstruktor SecurityPermission med flaggan SecurityPermissionFlag.ControlEvidence om följande villkor är uppfyllda: owner finns i en annan modul än den som anropar och kravet på ReflectionPermission med flaggan ReflectionPermissionFlag.MemberAccess har misslyckats. Om efterfrågan på SecurityPermission blir framgångsrik tillåts operationen.

Se även

Gäller för