Поделиться через


DynamicMethod Конструкторы

Определение

Создает динамический метод.

Перегрузки

DynamicMethod(String, Type, Type[])

Инициализирует анонимно размещенный динамический метод, указывая имя метода, тип возвращаемого значения и типы параметров.

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

Инициализирует анонимно размещенный динамический метод, указывая имя метода, возвращаемый тип, типы параметров и необходимость пропуска проверки видимости JIT для типов и членов, к которым получает доступ MSIL динамического метода.

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

Создает динамический метод, который является глобальным по отношению к модулю, используя имя метода, тип возвращаемого значения, типы параметров и модуль.

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

Создает динамический метод, указывая имя метода, тип возвращаемого значения, типы параметров и тип, с которым логически связан динамический метод.

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

Создает динамический метод, который является глобальным для модуля, указывая имя метода, тип возвращаемого значения, типы параметров, модуль и необходимость пропуска проверки видимости JIT для типов и членов, к которым получает доступ MSIL динамического метода.

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

Создает динамический метод, указывая имя метода, тип возвращаемого значения, типы параметров, тип, с которым логически связан динамический метод, и необходимость пропуска проверки видимости JIT для типов и членов, к которым получает доступ MSIL динамического метода.

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

Создает динамический метод, который является глобальным для модуля, указывая имя метода, атрибуты, соглашение о вызовах, тип возвращаемого значения, типы параметров, модуль и необходимость пропуска проверки видимости JIT для типов и членов, к которым получает доступ промежуточный язык Майкрософт (MSIL) динамического метода.

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

Создает динамический метод, указывая имя метода, атрибуты, соглашение о вызовах, тип возвращаемого значения, типы параметров, тип, с которым логически связан динамический метод, и необходимость пропуска проверки видимости JIT для типов и членов, к которым получает доступ промежуточный язык Майкрософт (MSIL) динамического метода.

DynamicMethod(String, Type, Type[])

Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs

Инициализирует анонимно размещенный динамический метод, указывая имя метода, тип возвращаемого значения и типы параметров.

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

Параметры

name
String

Имя динамического метода. Это может быть строка нулевой длины, но не null.

returnType
Type

Объект Type, который указывает возвращаемый тип динамического метода, или значение null, если метод не имеет возвращаемого типа.

parameterTypes
Type[]

Массив объектов Type, указывающих типы параметров динамического метода, или значение null, если метод не имеет параметров.

Исключения

Элемент parameterTypes имеет значение null или Void.

name имеет значение null.

платформа .NET Framework и .NET Core версий старше 2.1: returnType — это тип, для которого IsByRef возвращается true.

Комментарии

Динамический метод, созданный этим конструктором, связан с анонимной сборкой, а не с существующим типом или модулем. Анонимная сборка существует только для того, чтобы предоставить среду песочницы для динамических методов, то есть изолировать их от другого кода. Эта среда обеспечивает безопасность для создания и выполнения динамического метода частично доверенным кодом.

Этот конструктор указывает, что проверки видимости JIT будут применяться для промежуточного языка Майкрософт (MSIL) динамического метода. То есть код в динамическом методе имеет доступ к открытым методам открытых классов. Исключения возникают, если метод пытается получить доступ к типам или членам, которые являются private, protectedили internal (Friend в Visual Basic). Чтобы создать динамический метод с ограниченной возможностью пропуска проверок видимости JIT, используйте DynamicMethod(String, Type, Type[], Boolean) конструктор .

При создании анонимно размещенного динамического метода включается стек вызовов издаваемой сборки. При вызове метода вместо разрешений фактического вызывающего объекта используются разрешения издаваемой сборки. Таким образом, динамический метод не может выполняться на более высоком уровне привилегий, чем у сборки, создающей его, даже если он передается и выполняется сборкой с более высоким уровнем доверия.

Этот конструктор задает атрибуты MethodAttributes.Public метода и MethodAttributes.Static, а также соглашение о CallingConventions.Standardвызовах .

Примечание

Этот конструктор появился в платформа .NET Framework 3.5 или более поздней версии.

См. также раздел

Применяется к

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

Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs

Инициализирует анонимно размещенный динамический метод, указывая имя метода, возвращаемый тип, типы параметров и необходимость пропуска проверки видимости JIT для типов и членов, к которым получает доступ MSIL динамического метода.

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

Параметры

name
String

Имя динамического метода. Это может быть строка нулевой длины, но не null.

returnType
Type

Объект Type, который указывает возвращаемый тип динамического метода, или значение null, если метод не имеет возвращаемого типа.

parameterTypes
Type[]

Массив объектов Type, указывающих типы параметров динамического метода, или значение null, если метод не имеет параметров.

restrictedSkipVisibility
Boolean

true — пропускает проверки видимости JIT для типов и членов, к которым получает доступ MSIL динамического метода, с таким ограничением: уровень доверия сборок, содержащих эти типы и члены, должен быть равен уровню доверия стека вызовов, создающего динамический метод, или меньше его. В противном случае — false.

Исключения

Элемент parameterTypes имеет значение null или Void.

name имеет значение null.

платформа .NET Framework и .NET Core версий старше 2.1: returnType — это тип, для которого IsByRef возвращается true.

Комментарии

Динамический метод, созданный этим конструктором, связан с анонимной сборкой, а не с существующим типом или модулем. Анонимная сборка существует только для того, чтобы предоставить среду песочницы для динамических методов, то есть изолировать их от другого кода. Эта среда обеспечивает безопасность для создания и выполнения динамического метода частично доверенным кодом.

Анонимно размещенные динамические методы не имеют автоматического доступа к каким-либо типам или членам, которые являются private, protectedили internal (Friend в Visual Basic). Это отличается от динамических методов, связанных с существующим типом или модулем, которые имеют доступ к скрытым членам в связанных область.

Укажите true , restrictedSkipVisibility если динамический метод имеет доступ к типам или членам , которые являются private, protectedили internal. Это дает динамическому методу ограниченный доступ к этим членам. То есть доступ к членам можно получить только при соблюдении следующих условий:

  • Целевые члены относятся к сборке с уровнем доверия, равным или ниже стека вызовов, который создает динамический метод.

  • Стек вызовов, который выдает динамический метод, предоставляется ReflectionPermission с флагом ReflectionPermissionFlag.RestrictedMemberAccess . Это всегда верно, если код выполняется с полным доверием. Для кода с частичным доверием это значение имеет значение true, только если узел явно предоставляет разрешение.

    Важно!

    Если разрешение не было предоставлено, при вызове или вызове динамического метода возникает CreateDelegate исключение безопасности, а не при вызове этого конструктора. Для создания динамического метода специальные разрешения не требуются.

Например, динамический метод, созданный с restrictedSkipVisibility параметром для , может получить доступ к частному true члену любой сборки в стеке вызовов, если стеку вызовов предоставлен ограниченный доступ к члену. Если динамический метод создается с частично доверенным кодом в стеке вызовов, он не может получить доступ к частному члену типа в сборке платформа .NET Framework, так как такие сборки являются полностью доверенными.

Если restrictedSkipVisibility имеет значение false, применяются проверки видимости JIT. Код в динамическом методе имеет доступ к открытым методам открытых классов, и при попытке получить доступ к типам или членам, которые являются private, protectedили internal, создаются исключения.

При создании анонимно размещенного динамического метода включается стек вызовов издаваемой сборки. При вызове метода вместо разрешений фактического вызывающего объекта используются разрешения издавающего стека вызовов. Таким образом, динамический метод не может выполняться на более высоком уровне привилегий, чем у сборки, создающей его, даже если он передается и выполняется сборкой с более высоким уровнем доверия.

Этот конструктор задает атрибуты MethodAttributes.Public метода и MethodAttributes.Static, а также соглашение о CallingConventions.Standardвызовах .

Примечание

Этот конструктор появился в платформа .NET Framework 3.5 или более поздней версии.

См. также раздел

Применяется к

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

Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs

Создает динамический метод, который является глобальным по отношению к модулю, используя имя метода, тип возвращаемого значения, типы параметров и модуль.

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

Параметры

name
String

Имя динамического метода. Это может быть строка нулевой длины, но не null.

returnType
Type

Объект Type, который указывает возвращаемый тип динамического метода, или значение null, если метод не имеет возвращаемого типа.

parameterTypes
Type[]

Массив объектов Type, указывающих типы параметров динамического метода, или значение null, если метод не имеет параметров.

m
Module

Объект Module, представляющий модуль, с которым должен быть логически связан динамический метод.

Исключения

Элемент parameterTypes имеет значение null или Void.

-или-

m — это модуль, предоставляющий анонимное размещение для динамических методов.

name имеет значение null.

-или-

m имеет значение null.

платформа .NET Framework и .NET Core версий старше 2.1: returnType — это тип, для которого IsByRef возвращается true.

Примеры

В следующем примере кода создается динамический метод, который принимает два параметра. В примере создается простая функция, которая выводит первый параметр в консоль, а второй параметр используется в качестве возвращаемого значения метода. В примере метод завершается путем создания делегата, вызывается делегат с разными параметрами и, наконец, вызывается динамический метод с помощью Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) метода .

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

public ref class Test
{   
};

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

int main()
{
    // Create an array that specifies the types of the parameters
    // of the dynamic method. This method has a string parameter
    // and an int parameter.
    array<Type^>^ helloArgs = {String::typeid, int::typeid};

    // Create a dynamic method with the name "Hello", a return type
    // of int, and two parameters whose types are specified by the
    // array helloArgs. Create the method in the module that
    // defines the Test class.
    DynamicMethod^ hello = gcnew DynamicMethod("Hello", 
        int::typeid,
        helloArgs,
        Test::typeid->Module);

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

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

    // Create a delegate that represents the dynamic method. This
    // action completes the method, and any further attempts to
    // change the method will cause an exception.
    HelloInvoker^ helloDelegate =
        (HelloInvoker^) hello->CreateDelegate(HelloInvoker::typeid);

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

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

    // Create an array of arguments to use with the Invoke method.
    array<Object^>^ delegateArgs = {"\r\nHello, World!", 42};
    // Invoke the dynamic method using the arguments. This is much
    // slower than using the delegate, because you must create an
    // array to contain the arguments, and ValueType arguments
    // must be boxed.
    Object^ returnValueObject = hello->Invoke(nullptr, delegateArgs);
    Console::WriteLine("hello.Invoke returned {0}", returnValueObject);
}
using System;
using System.Reflection;
using System.Reflection.Emit;
using Microsoft.VisualBasic;

public class Test
{
    // Declare a delegate that will be used to execute the completed
    // dynamic method.
    private delegate int HelloInvoker(string msg, int ret);

    public static void Main()
    {
        // Create an array that specifies the types of the parameters
        // of the dynamic method. This method has a string parameter
        // and an int parameter.
        Type[] helloArgs = {typeof(string), typeof(int)};

        // Create a dynamic method with the name "Hello", a return type
        // of int, and two parameters whose types are specified by the
        // array helloArgs. Create the method in the module that
        // defines the Test class.
        DynamicMethod hello = new DynamicMethod("Hello",
            typeof(int),
            helloArgs,
            typeof(Test).Module);

        // Create an array that specifies the parameter types of the
        // overload of Console.WriteLine to be used in Hello.
        Type[] writeStringArgs = {typeof(string)};
        // Get the overload of Console.WriteLine that has one
        // String parameter.
        MethodInfo writeString =
            typeof(Console).GetMethod("WriteLine", writeStringArgs);

        // Get an ILGenerator and emit a body for the dynamic method.
        ILGenerator il = hello.GetILGenerator();
        // Load the first argument, which is a string, onto the stack.
        il.Emit(OpCodes.Ldarg_0);
        // Call the overload of Console.WriteLine that prints a string.
        il.EmitCall(OpCodes.Call, writeString, null);
        // The Hello method returns the value of the second argument;
        // to do this, load the onto the stack and return.
        il.Emit(OpCodes.Ldarg_1);
        il.Emit(OpCodes.Ret);

        // Create a delegate that represents the dynamic method. This
        // action completes the method, and any further attempts to
        // change the method will cause an exception.
        HelloInvoker hi =
            (HelloInvoker) hello.CreateDelegate(typeof(HelloInvoker));

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

        // Do it again, with different arguments.
        retval = hi("\r\nHi, Mom!", 5280);
        Console.WriteLine("Executing delegate hi(\"Hi, Mom!\", 5280) returned {0}",
            retval);

        // Create an array of arguments to use with the Invoke method.
        object[] invokeArgs = {"\r\nHello, World!", 42};
        // Invoke the dynamic method using the arguments. This is much
        // slower than using the delegate, because you must create an
        // array to contain the arguments, and ValueType arguments
        // must be boxed.
        object objRet = hello.Invoke(null, invokeArgs);
        Console.WriteLine("hello.Invoke returned {0}", objRet);
    }
}
Imports System.Reflection
Imports System.Reflection.Emit

Public Class Test
    ' Declare a delegate that will be used to execute the completed
    ' dynamic method. 
    Private Delegate Function HelloInvoker(ByVal msg As String, _
        ByVal ret As Integer) As Integer

    Public Shared Sub Main()
        ' Create an array that specifies the types of the parameters
        ' of the dynamic method. This method has a String parameter
        ' and an Integer parameter.
        Dim helloArgs() As Type = {GetType(String), GetType(Integer)}

        ' Create a dynamic method with the name "Hello", a return type
        ' of Integer, and two parameters whose types are specified by
        ' the array helloArgs. Create the method in the module that
        ' defines the Test class.
        Dim hello As New DynamicMethod("Hello", _
            GetType(Integer), _
            helloArgs, _
            GetType(Test).Module)

        ' Create an array that specifies the parameter types of the
        ' overload of Console.WriteLine to be used in Hello.
        Dim writeStringArgs() As Type = {GetType(String)}
        ' Get the overload of Console.WriteLine that has one
        ' String parameter.
        Dim writeString As MethodInfo = GetType(Console). _
            GetMethod("WriteLine", writeStringArgs) 

        ' Get an ILGenerator and emit a body for the dynamic method.
        Dim il As ILGenerator = hello.GetILGenerator()
        ' Load the first argument, which is a string, onto the stack.
        il.Emit(OpCodes.Ldarg_0)
        ' Call the overload of Console.WriteLine that prints a string.
        il.EmitCall(OpCodes.Call, writeString, Nothing)
        ' The Hello method returns the value of the second argument;
        ' to do this, load the onto the stack and return.
        il.Emit(OpCodes.Ldarg_1)
        il.Emit(OpCodes.Ret)

        ' Create a delegate that represents the dynamic method. This
        ' action completes the method, and any further attempts to
        ' change the method will cause an exception.
    Dim hi As HelloInvoker = _
            hello.CreateDelegate(GetType(HelloInvoker))

        ' Use the delegate to execute the dynamic method. Save and
        ' print the return value.
        Dim retval As Integer = hi(vbCrLf & "Hello, World!", 42)
        Console.WriteLine("Executing delegate hi(""Hello, World!"", 42) returned " _
            & retval)

        ' Do it again, with different arguments.
        retval = hi(vbCrLf & "Hi, Mom!", 5280)
        Console.WriteLine("Executing delegate hi(""Hi, Mom!"", 5280) returned " _
            & retval)

        ' Create an array of arguments to use with the Invoke method.
        Dim invokeArgs() As Object = {vbCrLf & "Hello, World!", 42}
        ' Invoke the dynamic method using the arguments. This is much
        ' slower than using the delegate, because you must create an
        ' array to contain the arguments, and ValueType arguments
        ' must be boxed. Note that this overload of Invoke is 
        ' inherited from MethodBase, and simply calls the more 
        ' complete overload of Invoke.
        Dim objRet As Object = hello.Invoke(Nothing, invokeArgs)
        Console.WriteLine("hello.Invoke returned " & objRet)
    End Sub
End Class

' This code example produces the following output:
'
'Hello, World!
'Executing delegate hi("Hello, World!", 42) returned 42
'
'Hi, Mom!
'Executing delegate hi("Hi, Mom!", 5280) returned 5280
'
'Hello, World!
'hello.Invoke returned 42
'

Комментарии

Этот конструктор задает атрибуты MethodAttributes.Public метода и MethodAttributes.Static, соглашение о CallingConventions.Standardвызовах и не пропускает проверки видимости JIT.

Динамический метод, созданный с помощью этого конструктора, имеет доступ к элементам public и internal (Friend в Visual Basic) всех типов, содержащихся в модуле m.

Примечание

Для обеспечения обратной совместимости этот конструктор требует SecurityPermission с флагом SecurityPermissionFlag.ControlEvidence , если выполняются следующие условия: m это модуль, отличный от вызывающего модуля, и запрос с ReflectionPermission флагом ReflectionPermissionFlag.MemberAccess завершился сбоем. Если требование выполнено SecurityPermission успешно, операция разрешена.

См. также раздел

Применяется к

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

Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs

Создает динамический метод, указывая имя метода, тип возвращаемого значения, типы параметров и тип, с которым логически связан динамический метод.

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

Параметры

name
String

Имя динамического метода. Это может быть строка нулевой длины, но не null.

returnType
Type

Объект Type, который указывает возвращаемый тип динамического метода, или значение null, если метод не имеет возвращаемого типа.

parameterTypes
Type[]

Массив объектов Type, указывающих типы параметров динамического метода, или значение null, если метод не имеет параметров.

owner
Type

Тип Type, с которым логически связан динамический метод. Динамический метод имеет доступ ко всем членам типа.

Исключения

Элемент parameterTypes имеет значение null или Void.

-или-

owner является интерфейсом, массивом, открытым универсальным типом или параметром универсального типа или метода.

name имеет значение null.

-или-

owner имеет значение null.

платформа .NET Framework и .NET Core версий старше 2.1: returnType — это тип, для которого IsByRef возвращается true.

Примеры

В следующем примере кода создается DynamicMethod объект , логически связанный с типом . Эта связь предоставляет ему доступ к закрытым членам этого типа.

В примере кода определяется класс Example с частным полем, класс с именем DerivedFromExample , производный от первого класса, тип делегата с именем UseLikeStatic , который возвращает Int32 и имеет параметры типа Example и Int32, а также тип делегата с именем UseLikeInstance , который возвращает Int32 и имеет один параметр типа Int32.

Затем в примере кода создается DynamicMethod объект , который изменяет частное поле экземпляра Example и возвращает предыдущее значение.

Примечание

Как правило, изменение внутренних полей классов не является хорошей практикой объектно-ориентированного программирования.

В примере кода создается экземпляр , Example а затем создаются два делегата. Первый относится к типу UseLikeStatic, который имеет те же параметры, что и динамический метод. Второй тип имеет тип UseLikeInstance, в котором отсутствует первый параметр (типа Example). Этот делегат создается с помощью перегрузки CreateDelegate(Type, Object) метода; вторым параметром этой перегрузки метода является экземпляр Example, в данном случае только что созданный экземпляр, привязанный к только что созданному делегату. При каждом вызове этого делегата динамический метод действует на привязанный Exampleэкземпляр .

Примечание

Это пример неактивных правил привязки делегатов, представленных в платформа .NET Framework 2.0, а также новых перегрузок Delegate.CreateDelegate метода . Дополнительные сведения см. в описании класса Delegate.

Вызывается UseLikeStatic делегат, передавая экземпляр Example , привязанный к делегату UseLikeInstance . UseLikeInstance Затем вызывается делегат, чтобы оба делегата действовали на одном экземпляре Example. Изменения значений внутреннего поля отображаются после каждого вызова. Наконец, UseLikeInstance делегат привязывается к экземпляру , и вызовы делегата DerivedFromExampleповторяются.

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'

Комментарии

Динамический метод, созданный с помощью этого конструктора, имеет доступ ко всем членам типа owner, а также к общедоступным членам и internal (Friend в Visual Basic) всех других типов в модуле, который содержит owner.

Этот конструктор задает атрибуты MethodAttributes.Public метода и MethodAttributes.Static, соглашение о CallingConventions.Standardвызовах и не пропускает проверки видимости JIT.

Примечание

Для обратной совместимости этот конструктор требует SecurityPermission с флагом SecurityPermissionFlag.ControlEvidence , если выполняются следующие условия: owner находится в модуле, отличном от вызывающего модуля, и запрос с ReflectionPermission флагом ReflectionPermissionFlag.MemberAccess завершился сбоем. Если требование выполнено SecurityPermission успешно, операция разрешена.

См. также раздел

Применяется к

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

Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs

Создает динамический метод, который является глобальным для модуля, указывая имя метода, тип возвращаемого значения, типы параметров, модуль и необходимость пропуска проверки видимости JIT для типов и членов, к которым получает доступ MSIL динамического метода.

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

Параметры

name
String

Имя динамического метода. Это может быть строка нулевой длины, но не null.

returnType
Type

Объект Type, который указывает возвращаемый тип динамического метода, или значение null, если метод не имеет возвращаемого типа.

parameterTypes
Type[]

Массив объектов Type, указывающих типы параметров динамического метода, или значение null, если метод не имеет параметров.

m
Module

Объект Module, представляющий модуль, с которым должен быть логически связан динамический метод.

skipVisibility
Boolean

Значение true для пропуска проверки видимости JIT для типов и членов, к которым получает доступ MSIL динамического метода.

Исключения

Элемент parameterTypes имеет значение null или Void.

-или-

m — это модуль, предоставляющий анонимное размещение для динамических методов.

name имеет значение null.

-или-

m имеет значение null.

платформа .NET Framework и .NET Core версий старше 2.1: returnType — это тип, для которого IsByRef возвращается true.

Комментарии

Этот конструктор задает атрибуты MethodAttributes.Public метода и MethodAttributes.Static, а также соглашение о CallingConventions.Standardвызове .

Динамический метод, созданный с помощью этого конструктора, имеет доступ к элементам public и internal (Friend в Visual Basic) всех типов в автономном модуле m. Пропуск проверок видимости JIT-компилятора позволяет динамическому методу получать доступ к закрытым и защищенным членам всех других типов. Это полезно, например, при написании кода для сериализации объектов.

Примечание

Для обеспечения обратной совместимости этот конструктор требует SecurityPermission с флагом SecurityPermissionFlag.ControlEvidence , если выполняются следующие условия: m это модуль, отличный от вызывающего модуля, и запрос с ReflectionPermission флагом ReflectionPermissionFlag.MemberAccess завершился сбоем. Если требование выполнено SecurityPermission успешно, операция разрешена.

См. также раздел

Применяется к

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

Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs

Создает динамический метод, указывая имя метода, тип возвращаемого значения, типы параметров, тип, с которым логически связан динамический метод, и необходимость пропуска проверки видимости JIT для типов и членов, к которым получает доступ 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);
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)

Параметры

name
String

Имя динамического метода. Это может быть строка нулевой длины, но не null.

returnType
Type

Объект Type, который указывает возвращаемый тип динамического метода, или значение null, если метод не имеет возвращаемого типа.

parameterTypes
Type[]

Массив объектов Type, указывающих типы параметров динамического метода, или значение null, если метод не имеет параметров.

owner
Type

Тип Type, с которым логически связан динамический метод. Динамический метод имеет доступ ко всем членам типа.

skipVisibility
Boolean

Значение true для пропуска проверки видимости JIT для типов и членов, к которым получает доступ MSIL динамического метода; в противном случае — значение false.

Исключения

Элемент parameterTypes имеет значение null или Void.

-или-

owner является интерфейсом, массивом, открытым универсальным типом или параметром универсального типа или метода.

name имеет значение null.

-или-

owner имеет значение null.

платформа .NET Framework и .NET Core версий старше 2.1: returnType — это тип, для которого IsByRef возвращается true.

Комментарии

Динамический метод, созданный с помощью этого конструктора, имеет доступ ко всем членам типа owner, а также к общедоступным членам и internal (Friend в Visual Basic) всех других типов в модуле, который содержит owner. Пропуск проверок видимости JIT-компилятора позволяет динамическому методу получать доступ к закрытым и защищенным членам всех других типов. Это полезно, например, при написании кода для сериализации объектов.

Этот конструктор задает атрибуты MethodAttributes.Public метода и MethodAttributes.Static, а также соглашение о CallingConventions.Standardвызове .

Примечание

Для обратной совместимости этот конструктор требует SecurityPermission с флагом SecurityPermissionFlag.ControlEvidence , если выполняются следующие условия: owner находится в модуле, отличном от вызывающего модуля, и запрос с ReflectionPermission флагом ReflectionPermissionFlag.MemberAccess завершился сбоем. Если требование выполнено SecurityPermission успешно, операция разрешена.

См. также раздел

Применяется к

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

Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs

Создает динамический метод, который является глобальным для модуля, указывая имя метода, атрибуты, соглашение о вызовах, тип возвращаемого значения, типы параметров, модуль и необходимость пропуска проверки видимости JIT для типов и членов, к которым получает доступ промежуточный язык Майкрософт (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);
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)

Параметры

name
String

Имя динамического метода. Это может быть строка нулевой длины, но не null.

attributes
MethodAttributes

Битовая комбинация значений MethodAttributes, определяющая атрибуты динамического метода. Разрешена только комбинация Public и Static.

callingConvention
CallingConventions

Соглашение о вызовах для динамического метода. Этот параметр должен содержать значение Standard.

returnType
Type

Объект Type, который указывает возвращаемый тип динамического метода, или значение null, если метод не имеет возвращаемого типа.

parameterTypes
Type[]

Массив объектов Type, указывающих типы параметров динамического метода, или значение null, если метод не имеет параметров.

m
Module

Объект Module, представляющий модуль, с которым должен быть логически связан динамический метод.

skipVisibility
Boolean

Значение true для пропуска проверки видимости JIT для типов и членов, к которым получает доступ MSIL динамического метода; в противном случае — значение false.

Исключения

Элемент parameterTypes имеет значение null или Void.

-или-

m — это модуль, предоставляющий анонимное размещение для динамических методов.

name имеет значение null.

-или-

m имеет значение null.

attributes представляет собой сочетание флагов, отличных от Public и Static.

-или-

callingConvention не является Standard.

-или-

returnType — это тип, для которого IsByRef возвращает true.

Комментарии

Динамический метод, созданный с помощью этого конструктора, имеет доступ к членам public и internal (Friend в Visual Basic) всех открытых и внутренних типов, содержащихся в модуле m.

Пропуск проверок видимости JIT-компилятора позволяет динамическому методу получать доступ к закрытым и защищенным членам всех других типов в модуле и во всех других сборках. Это полезно, например, при написании кода для сериализации объектов.

Примечание

Для обеспечения обратной совместимости этот конструктор требует SecurityPermission с флагом SecurityPermissionFlag.ControlEvidence , если выполняются следующие условия: m это модуль, отличный от вызывающего модуля, и запрос с ReflectionPermission флагом ReflectionPermissionFlag.MemberAccess завершился сбоем. Если требование выполнено SecurityPermission успешно, операция разрешена.

См. также раздел

Применяется к

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

Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs
Исходный код:
DynamicMethod.cs

Создает динамический метод, указывая имя метода, атрибуты, соглашение о вызовах, тип возвращаемого значения, типы параметров, тип, с которым логически связан динамический метод, и необходимость пропуска проверки видимости JIT для типов и членов, к которым получает доступ промежуточный язык Майкрософт (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);
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)

Параметры

name
String

Имя динамического метода. Это может быть строка нулевой длины, но не null.

attributes
MethodAttributes

Битовая комбинация значений MethodAttributes, определяющая атрибуты динамического метода. Разрешена только комбинация Public и Static.

callingConvention
CallingConventions

Соглашение о вызовах для динамического метода. Этот параметр должен содержать значение Standard.

returnType
Type

Объект Type, который указывает возвращаемый тип динамического метода, или значение null, если метод не имеет возвращаемого типа.

parameterTypes
Type[]

Массив объектов Type, указывающих типы параметров динамического метода, или значение null, если метод не имеет параметров.

owner
Type

Тип Type, с которым логически связан динамический метод. Динамический метод имеет доступ ко всем членам типа.

skipVisibility
Boolean

Значение true для пропуска проверки видимости JIT для типов и членов, к которым получает доступ MSIL динамического метода; в противном случае — значение false.

Исключения

Элемент parameterTypes имеет значение null или Void.

-или-

owner является интерфейсом, массивом, открытым универсальным типом или параметром универсального типа или метода.

name имеет значение null.

-или-

owner имеет значение null.

attributes представляет собой сочетание флагов, отличных от Public и Static.

-или-

callingConvention не является Standard.

-или-

returnType — это тип, для которого IsByRef возвращает true.

Комментарии

Динамический метод является глобальным для модуля, содержащего тип owner. Он имеет доступ ко всем членам типа owner.

Динамический метод, созданный с помощью этого конструктора, имеет доступ ко всем членам типа owner, а также к общедоступным членам и internal (Friend в Visual Basic) всех типов, содержащихся в модуле , который содержит owner. Пропуск проверок видимости JIT-компилятора позволяет динамическому методу получать доступ к закрытым и защищенным членам всех других типов. Это полезно, например, при написании кода для сериализации объектов.

Примечание

Для обратной совместимости этот конструктор требует SecurityPermission с флагом SecurityPermissionFlag.ControlEvidence , если выполняются следующие условия: owner находится в модуле, отличном от вызывающего модуля, и запрос с ReflectionPermission флагом ReflectionPermissionFlag.MemberAccess завершился сбоем. Если требование выполнено SecurityPermission успешно, операция разрешена.

См. также раздел

Применяется к