DynamicMethod Constructores
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Crea un método dinámico.
Sobrecargas
DynamicMethod(String, Type, Type[]) |
Inicializa un método dinámico hospedado de forma anónima, especificando el nombre del método, el tipo de valor devuelto y los tipos de parámetros. |
DynamicMethod(String, Type, Type[], Boolean) |
Inicializa un método dinámico hospedado de forma anónima, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetros y si se deben omitir comprobaciones de visibilidad Just-In-Time (JIT) para tipos y miembros a los que se tiene acceso por el lenguaje intermedio de Microsoft (MSIL) del método dinámico. |
DynamicMethod(String, Type, Type[], Module) |
Crea un método dinámico que es global para un módulo, especificando el nombre del método, el tipo de devolución, los tipos de parámetros y el módulo. |
DynamicMethod(String, Type, Type[], Type) |
Crea un método dinámico, especificando el nombre del método, tipo de valor devuelto, los tipos de parámetro y el tipo al que está asociado lógicamente el método dinámico. |
DynamicMethod(String, Type, Type[], Module, Boolean) |
Crea un método dinámico que es global para un módulo, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetros, el módulo y si se deben omitir comprobaciones de visibilidad Just-In-Time (JIT) para tipos y miembros a los que se tiene acceso por el lenguaje intermedio de Microsoft (MSIL) del método dinámico. |
DynamicMethod(String, Type, Type[], Type, Boolean) |
Crea un método dinámico que especifica el nombre del método, el tipo de valor de devolución, los tipos de parámetros, el tipo con el que está asociado lógicamente el método dinámico y si se deben omitir comprobaciones de visibilidad Just-In-Time (JIT) para los tipos y miembros a los que se tiene acceso mediante el lenguaje intermedio de Microsoft (MSIL) del método dinámico. |
DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Module, Boolean) |
Crea un método dinámico que es global para un módulo, especificando el nombre del método, los atributos, la convención de nomenclatura, el tipo de valor devuelto, los tipos de parámetros, el módulo y si se deben omitir comprobaciones de visibilidad Just-In-Time (JIT) para tipos y miembros a los que se tiene acceso por el lenguaje intermedio de Microsoft (MSIL) del método dinámico. |
DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type, Boolean) |
Crea un método dinámico que especifica el nombre del método, los atributos, la convención de llamada, el tipo de valor de devolución, los tipos de parámetros, el tipo con el que está asociado lógicamente el método dinámico y si se deben omitir comprobaciones de visibilidad Just-In-Time (JIT) para los tipos y miembros a los que se tiene acceso mediante el lenguaje intermedio de Microsoft (MSIL) del método dinámico. |
DynamicMethod(String, Type, Type[])
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
Inicializa un método dinámico hospedado de forma anónima, especificando el nombre del método, el tipo de valor devuelto y los tipos de parámetros.
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type())
Parámetros
- name
- String
Nombre del método dinámico. Esto puede ser una cadena de longitud cero, pero no puede ser null
.
- returnType
- Type
Un objeto Type que especifica el tipo de valor devuelto del método dinámico o null
si el método no tiene ningún tipo de valor devuelto.
- parameterTypes
- Type[]
Matriz de objetos Type que especifican los tipos de los parámetros del método dinámico, o null
si el método no tiene parámetros.
Excepciones
Un elemento de parameterTypes
es null
o Void.
name
es null
.
Versiones de .NET Framework y .NET Core anteriores a la 2.1: returnType
es un tipo para el que IsByRef devuelve true
.
Comentarios
El método dinámico creado por este constructor está asociado a un ensamblado anónimo en lugar de a un tipo o módulo existente. El ensamblado anónimo solo existe para proporcionar un entorno de espacio aislado para los métodos dinámicos, es decir, para aislarlos de otro código. Este entorno hace que sea seguro que el método dinámico se emita y ejecute mediante código de confianza parcial.
Este constructor especifica que se aplicarán comprobaciones de visibilidad Just-In-Time (JIT) para el lenguaje intermedio de Microsoft (MSIL) del método dinámico. Es decir, el código del método dinámico tiene acceso a métodos públicos de clases públicas. Se producen excepciones si el método intenta obtener acceso a tipos o miembros que son private
, protected
o internal
(Friend
en Visual Basic). Para crear un método dinámico que tenga la capacidad restringida de omitir las comprobaciones de visibilidad JIT, use el DynamicMethod(String, Type, Type[], Boolean) constructor .
Cuando se construye un método dinámico hospedado de forma anónima, se incluye la pila de llamadas del ensamblado emisor. Cuando se invoca el método , se usan los permisos del ensamblado emisor en lugar de los permisos del llamador real. Por lo tanto, el método dinámico no se puede ejecutar en un nivel de privilegio mayor que el del ensamblado que lo emitió, incluso si se pasa a un ensamblado que tiene un nivel de confianza superior y lo ejecuta.
Este constructor especifica los atributos MethodAttributes.Public de método y MethodAttributes.Static, y la convención CallingConventions.Standardde llamada .
Nota
Este constructor se introdujo en .NET Framework 3.5 o posterior.
Consulte también
- Cómo: Definir y ejecutar métodos dinámicos
- Problemas de seguridad en la emisión de la reflexión
- Tutorial: Emisión de código en escenarios que no son de plena confianza
Se aplica a
DynamicMethod(String, Type, Type[], Boolean)
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
Inicializa un método dinámico hospedado de forma anónima, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetros y si se deben omitir comprobaciones de visibilidad Just-In-Time (JIT) para tipos y miembros a los que se tiene acceso por el lenguaje intermedio de Microsoft (MSIL) del método dinámico.
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, bool restrictedSkipVisibility);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes, bool restrictedSkipVisibility);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes, bool restrictedSkipVisibility);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), restrictedSkipVisibility As Boolean)
Parámetros
- name
- String
Nombre del método dinámico. Esto puede ser una cadena de longitud cero, pero no puede ser null
.
- returnType
- Type
Un objeto Type que especifica el tipo de valor devuelto del método dinámico o null
si el método no tiene ningún tipo de valor devuelto.
- parameterTypes
- Type[]
Matriz de objetos Type que especifican los tipos de los parámetros del método dinámico, o null
si el método no tiene parámetros.
- restrictedSkipVisibility
- Boolean
true
para omitir las comprobaciones de visibilidad de JIT en tipos y miembros a los que se tiene acceso por el MSIL del método dinámico, con esta restricción: el nivel de confianza de los ensamblados que contienen esos tipos y miembros debe ser igual o menor que el nivel de confianza de la pila de llamadas que emite el método dinámico; de lo contrario, false
.
Excepciones
Un elemento de parameterTypes
es null
o Void.
name
es null
.
Versiones de .NET Framework y .NET Core anteriores a la 2.1: returnType
es un tipo para el que IsByRef devuelve true
.
Comentarios
El método dinámico creado por este constructor está asociado a un ensamblado anónimo en lugar de a un tipo o módulo existente. El ensamblado anónimo solo existe para proporcionar un entorno de espacio aislado para los métodos dinámicos, es decir, para aislarlos de otro código. Este entorno hace que sea seguro que el método dinámico se emita y ejecute mediante código de confianza parcial.
Los métodos dinámicos hospedados de forma anónima no tienen acceso automático a ningún tipo o miembro que sean private
, protected
o internal
(Friend
en Visual Basic). Esto es diferente de los métodos dinámicos asociados a un tipo o módulo existente, que tienen acceso a miembros ocultos en su ámbito asociado.
Especifique true
para restrictedSkipVisibility
si el método dinámico tiene que tener acceso a tipos o miembros que son private
, protected
o internal
. Esto proporciona al método dinámico acceso restringido a estos miembros. Es decir, solo se puede acceder a los miembros si se cumplen las condiciones siguientes:
Los miembros de destino pertenecen a un ensamblado que tiene un nivel de confianza igual o inferior a la pila de llamadas que emite el método dinámico.
La pila de llamadas que emite el método dinámico se concede ReflectionPermission con la ReflectionPermissionFlag.RestrictedMemberAccess marca . Esto siempre es cierto cuando el código se ejecuta con plena confianza. En el caso del código de confianza parcial, solo es true si el host concede explícitamente el permiso.
Importante
Si no se ha concedido el permiso, se produce una excepción de seguridad cuando CreateDelegate se llama a o cuando se invoca el método dinámico, no cuando se llama a este constructor. No se requieren permisos especiales para emitir el método dinámico.
Por ejemplo, un método dinámico que se crea con restrictedSkipVisibility
establecido en true
puede tener acceso a un miembro privado de cualquier ensamblado de la pila de llamadas si se le ha concedido acceso restringido a miembros. Si el método dinámico se crea con código de confianza parcial en la pila de llamadas, no puede tener acceso a un miembro privado de un tipo en un ensamblado de .NET Framework, ya que estos ensamblados son de plena confianza.
Si restrictedSkipVisibility
es false
, se aplican comprobaciones de visibilidad JIT. El código del método dinámico tiene acceso a métodos públicos de clases públicas y se producen excepciones si intenta acceder a tipos o miembros que son private
, protected
o internal
.
Cuando se construye un método dinámico hospedado de forma anónima, se incluye la pila de llamadas del ensamblado emisor. Cuando se invoca el método , se usan los permisos de la pila de llamadas emisoras en lugar de los permisos del autor de la llamada real. Por lo tanto, el método dinámico no se puede ejecutar en un nivel de privilegio mayor que el del ensamblado que lo emitió, incluso si se pasa a un ensamblado que tiene un nivel de confianza superior y lo ejecuta.
Este constructor especifica los atributos MethodAttributes.Public de método y MethodAttributes.Static, y la convención CallingConventions.Standardde llamada .
Nota
Este constructor se introdujo en .NET Framework 3.5 o posterior.
Consulte también
- Cómo: Definir y ejecutar métodos dinámicos
- Problemas de seguridad en la emisión de la reflexión
- Tutorial: Emisión de código en escenarios que no son de plena confianza
Se aplica a
DynamicMethod(String, Type, Type[], Module)
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
Crea un método dinámico que es global para un módulo, especificando el nombre del método, el tipo de devolución, los tipos de parámetros y el módulo.
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Reflection::Module ^ m);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes, System.Reflection.Module m);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes, System.Reflection.Module m);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * System.Reflection.Module -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), m As Module)
Parámetros
- name
- String
Nombre del método dinámico. Esto puede ser una cadena de longitud cero, pero no puede ser null
.
- returnType
- Type
Un objeto Type que especifica el tipo de valor devuelto del método dinámico o null
si el método no tiene ningún tipo de valor devuelto.
- parameterTypes
- Type[]
Matriz de objetos Type que especifican los tipos de los parámetros del método dinámico, o null
si el método no tiene parámetros.
- m
- Module
Module que representa el módulo con el que se va a asociar de manera lógica al método dinámico.
Excepciones
Un elemento de parameterTypes
es null
o Void.
o bien
m
es un módulo que proporciona hospedaje anónimo para los métodos dinámicos.
Versiones de .NET Framework y .NET Core anteriores a la 2.1: returnType
es un tipo para el que IsByRef devuelve true
.
Ejemplos
En el ejemplo de código siguiente se crea un método dinámico que toma dos parámetros. En el ejemplo se emite un cuerpo de función simple que imprime el primer parámetro en la consola y el ejemplo usa el segundo parámetro como valor devuelto del método . En el ejemplo se completa el método mediante la creación de un delegado, se invoca el delegado con parámetros diferentes y, por último, se invoca el método dinámico mediante el Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) método .
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
public ref class Test
{
};
// Declare a delegate that will be used to execute the completed
// dynamic method.
delegate int HelloInvoker(String^ msg, int ret);
int main()
{
// Create an array that specifies the types of the parameters
// of the dynamic method. This method has a string parameter
// and an int parameter.
array<Type^>^ helloArgs = {String::typeid, int::typeid};
// Create a dynamic method with the name "Hello", a return type
// of int, and two parameters whose types are specified by the
// array helloArgs. Create the method in the module that
// defines the Test class.
DynamicMethod^ hello = gcnew DynamicMethod("Hello",
int::typeid,
helloArgs,
Test::typeid->Module);
// Create an array that specifies the parameter types of the
// overload of Console.WriteLine to be used in Hello.
array<Type^>^ writeStringArgs = {String::typeid};
// Get the overload of Console.WriteLine that has one
// String parameter.
MethodInfo^ writeString =
Console::typeid->GetMethod("WriteLine", writeStringArgs);
// Get an ILGenerator and emit a body for the dynamic method.
ILGenerator^ ilgen = hello->GetILGenerator();
// Load the first argument, which is a string, onto the stack.
ilgen->Emit(OpCodes::Ldarg_0);
// Call the overload of Console.WriteLine that prints a string.
ilgen->EmitCall(OpCodes::Call, writeString, nullptr);
// The Hello method returns the value of the second argument;
// to do this, load the onto the stack and return.
ilgen->Emit(OpCodes::Ldarg_1);
ilgen->Emit(OpCodes::Ret);
// Create a delegate that represents the dynamic method. This
// action completes the method, and any further attempts to
// change the method will cause an exception.
HelloInvoker^ helloDelegate =
(HelloInvoker^) hello->CreateDelegate(HelloInvoker::typeid);
// Use the delegate to execute the dynamic method. Save and
// print the return value.
int returnValue = helloDelegate("\r\nHello, World!", 42);
Console::WriteLine("helloDelegate(\"Hello, World!\", 42) returned {0}",
returnValue);
// Do it again, with different arguments.
returnValue = helloDelegate("\r\nHi, Mom!", 5280);
Console::WriteLine("helloDelegate(\"Hi, Mom!\", 5280) returned {0}",
returnValue);
// Create an array of arguments to use with the Invoke method.
array<Object^>^ delegateArgs = {"\r\nHello, World!", 42};
// Invoke the dynamic method using the arguments. This is much
// slower than using the delegate, because you must create an
// array to contain the arguments, and ValueType arguments
// must be boxed.
Object^ returnValueObject = hello->Invoke(nullptr, delegateArgs);
Console::WriteLine("hello.Invoke returned {0}", returnValueObject);
}
using System;
using System.Reflection;
using System.Reflection.Emit;
using Microsoft.VisualBasic;
public class Test
{
// Declare a delegate that will be used to execute the completed
// dynamic method.
private delegate int HelloInvoker(string msg, int ret);
public static void Main()
{
// Create an array that specifies the types of the parameters
// of the dynamic method. This method has a string parameter
// and an int parameter.
Type[] helloArgs = {typeof(string), typeof(int)};
// Create a dynamic method with the name "Hello", a return type
// of int, and two parameters whose types are specified by the
// array helloArgs. Create the method in the module that
// defines the Test class.
DynamicMethod hello = new DynamicMethod("Hello",
typeof(int),
helloArgs,
typeof(Test).Module);
// Create an array that specifies the parameter types of the
// overload of Console.WriteLine to be used in Hello.
Type[] writeStringArgs = {typeof(string)};
// Get the overload of Console.WriteLine that has one
// String parameter.
MethodInfo writeString =
typeof(Console).GetMethod("WriteLine", writeStringArgs);
// Get an ILGenerator and emit a body for the dynamic method.
ILGenerator il = hello.GetILGenerator();
// Load the first argument, which is a string, onto the stack.
il.Emit(OpCodes.Ldarg_0);
// Call the overload of Console.WriteLine that prints a string.
il.EmitCall(OpCodes.Call, writeString, null);
// The Hello method returns the value of the second argument;
// to do this, load the onto the stack and return.
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Ret);
// Create a delegate that represents the dynamic method. This
// action completes the method, and any further attempts to
// change the method will cause an exception.
HelloInvoker hi =
(HelloInvoker) hello.CreateDelegate(typeof(HelloInvoker));
// Use the delegate to execute the dynamic method. Save and
// print the return value.
int retval = hi("\r\nHello, World!", 42);
Console.WriteLine("Executing delegate hi(\"Hello, World!\", 42) returned {0}",
retval);
// Do it again, with different arguments.
retval = hi("\r\nHi, Mom!", 5280);
Console.WriteLine("Executing delegate hi(\"Hi, Mom!\", 5280) returned {0}",
retval);
// Create an array of arguments to use with the Invoke method.
object[] invokeArgs = {"\r\nHello, World!", 42};
// Invoke the dynamic method using the arguments. This is much
// slower than using the delegate, because you must create an
// array to contain the arguments, and ValueType arguments
// must be boxed.
object objRet = hello.Invoke(null, invokeArgs);
Console.WriteLine("hello.Invoke returned {0}", objRet);
}
}
Imports System.Reflection
Imports System.Reflection.Emit
Public Class Test
' Declare a delegate that will be used to execute the completed
' dynamic method.
Private Delegate Function HelloInvoker(ByVal msg As String, _
ByVal ret As Integer) As Integer
Public Shared Sub Main()
' Create an array that specifies the types of the parameters
' of the dynamic method. This method has a String parameter
' and an Integer parameter.
Dim helloArgs() As Type = {GetType(String), GetType(Integer)}
' Create a dynamic method with the name "Hello", a return type
' of Integer, and two parameters whose types are specified by
' the array helloArgs. Create the method in the module that
' defines the Test class.
Dim hello As New DynamicMethod("Hello", _
GetType(Integer), _
helloArgs, _
GetType(Test).Module)
' Create an array that specifies the parameter types of the
' overload of Console.WriteLine to be used in Hello.
Dim writeStringArgs() As Type = {GetType(String)}
' Get the overload of Console.WriteLine that has one
' String parameter.
Dim writeString As MethodInfo = GetType(Console). _
GetMethod("WriteLine", writeStringArgs)
' Get an ILGenerator and emit a body for the dynamic method.
Dim il As ILGenerator = hello.GetILGenerator()
' Load the first argument, which is a string, onto the stack.
il.Emit(OpCodes.Ldarg_0)
' Call the overload of Console.WriteLine that prints a string.
il.EmitCall(OpCodes.Call, writeString, Nothing)
' The Hello method returns the value of the second argument;
' to do this, load the onto the stack and return.
il.Emit(OpCodes.Ldarg_1)
il.Emit(OpCodes.Ret)
' Create a delegate that represents the dynamic method. This
' action completes the method, and any further attempts to
' change the method will cause an exception.
Dim hi As HelloInvoker = _
hello.CreateDelegate(GetType(HelloInvoker))
' Use the delegate to execute the dynamic method. Save and
' print the return value.
Dim retval As Integer = hi(vbCrLf & "Hello, World!", 42)
Console.WriteLine("Executing delegate hi(""Hello, World!"", 42) returned " _
& retval)
' Do it again, with different arguments.
retval = hi(vbCrLf & "Hi, Mom!", 5280)
Console.WriteLine("Executing delegate hi(""Hi, Mom!"", 5280) returned " _
& retval)
' Create an array of arguments to use with the Invoke method.
Dim invokeArgs() As Object = {vbCrLf & "Hello, World!", 42}
' Invoke the dynamic method using the arguments. This is much
' slower than using the delegate, because you must create an
' array to contain the arguments, and ValueType arguments
' must be boxed. Note that this overload of Invoke is
' inherited from MethodBase, and simply calls the more
' complete overload of Invoke.
Dim objRet As Object = hello.Invoke(Nothing, invokeArgs)
Console.WriteLine("hello.Invoke returned " & objRet)
End Sub
End Class
' This code example produces the following output:
'
'Hello, World!
'Executing delegate hi("Hello, World!", 42) returned 42
'
'Hi, Mom!
'Executing delegate hi("Hi, Mom!", 5280) returned 5280
'
'Hello, World!
'hello.Invoke returned 42
'
Comentarios
Este constructor especifica los MethodAttributes.Public atributos de método y MethodAttributes.Static, la convención CallingConventions.Standardde llamada y no omite las comprobaciones de visibilidad Just-In-Time (JIT).
El método dinámico creado con este constructor tiene acceso a miembros públicos y internal
(Friend
en Visual Basic) de todos los tipos contenidos en el módulo m
.
Nota
Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con la SecurityPermissionFlag.ControlEvidence marca si se cumplen las condiciones siguientes: m
es un módulo distinto del módulo que realiza la llamada y se ha producido un error en la demanda ReflectionPermission de con la ReflectionPermissionFlag.MemberAccess marca . Si la demanda de SecurityPermission se realiza correctamente, se permite la operación.
Consulte también
Se aplica a
DynamicMethod(String, Type, Type[], Type)
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
Crea un método dinámico, especificando el nombre del método, tipo de valor devuelto, los tipos de parámetro y el tipo al que está asociado lógicamente el método dinámico.
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, Type ^ owner);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes, Type owner);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes, Type owner);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * Type -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), owner As Type)
Parámetros
- name
- String
Nombre del método dinámico. Esto puede ser una cadena de longitud cero, pero no puede ser null
.
- returnType
- Type
Un objeto Type que especifica el tipo de valor devuelto del método dinámico o null
si el método no tiene ningún tipo de valor devuelto.
- parameterTypes
- Type[]
Matriz de objetos Type que especifican los tipos de los parámetros del método dinámico, o null
si el método no tiene parámetros.
- owner
- Type
Type con el que está asociado lógicamente el método dinámico. El método dinámico tiene acceso a todos los miembros del tipo.
Excepciones
Un elemento de parameterTypes
es null
o Void.
o bien
owner
es una interfaz, una matriz, un tipo genérico abierto o un parámetro de tipo de un tipo o método genérico.
Versiones de .NET Framework y .NET Core anteriores a 2.1: returnType
es un tipo para el que IsByRef devuelve true
.
Ejemplos
En el ejemplo de código siguiente se crea un DynamicMethod objeto que está asociado lógicamente a un tipo . Esta asociación le proporciona acceso a los miembros privados de ese tipo.
En el ejemplo de código se define una clase denominada Example
con un campo privado, una clase denominada DerivedFromExample
que deriva de la primera clase, un tipo delegado denominado UseLikeStatic
que devuelve Int32 y tiene parámetros de tipo Example
y Int32, y un tipo delegado denominado UseLikeInstance
que devuelve Int32 y tiene un parámetro de tipo Int32.
A continuación, el código de ejemplo crea un DynamicMethod objeto que cambia el campo privado de una instancia de Example
y devuelve el valor anterior.
Nota
En general, cambiar los campos internos de las clases no es una buena práctica de codificación orientada a objetos.
El código de ejemplo crea una instancia de Example
y, a continuación, crea dos delegados. La primera es de tipo UseLikeStatic
, que tiene los mismos parámetros que el método dinámico. El segundo es de tipo UseLikeInstance
, que carece del primer parámetro (de tipo Example
). Este delegado se crea mediante la sobrecarga del CreateDelegate(Type, Object) método; el segundo parámetro de esa sobrecarga de método es una instancia de Example
, en este caso, la instancia recién creada, que está enlazada al delegado recién creado. Cada vez que se invoca ese delegado, el método dinámico actúa en la instancia enlazada de Example
.
Nota
Este es un ejemplo de las reglas relajadas para el enlace delegado introducido en .NET Framework 2.0, junto con nuevas sobrecargas del Delegate.CreateDelegate método. Para obtener más información, vea la clase Delegate.
Se invoca al UseLikeStatic
delegado, pasando la instancia de Example
que está enlazada al UseLikeInstance
delegado. A continuación, se invoca el UseLikeInstance
delegado para que ambos delegados actúen en la misma instancia de Example
. Los cambios en los valores del campo interno se muestran después de cada llamada. Por último, un UseLikeInstance
delegado está enlazado a una instancia de DerivedFromExample
y se repiten las llamadas de delegado.
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'
Comentarios
El método dinámico creado con este constructor tiene acceso a todos los miembros del tipo owner
, y a los miembros públicos y internal
(Friend
en Visual Basic) de todos los demás tipos del módulo que contiene owner
.
Este constructor especifica los MethodAttributes.Public atributos de método y MethodAttributes.Static, la convención CallingConventions.Standardde llamada y no omite las comprobaciones de visibilidad Just-In-Time (JIT).
Nota
Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con la SecurityPermissionFlag.ControlEvidence marca si se cumplen las condiciones siguientes: owner
se encuentra en un módulo distinto del módulo que realiza la llamada y se ha producido un error en la demanda de ReflectionPermission con la ReflectionPermissionFlag.MemberAccess marca . Si la demanda de SecurityPermission se realiza correctamente, se permite la operación.
Consulte también
Se aplica a
DynamicMethod(String, Type, Type[], Module, Boolean)
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
Crea un método dinámico que es global para un módulo, especificando el nombre del método, el tipo de valor devuelto, los tipos de parámetros, el módulo y si se deben omitir comprobaciones de visibilidad Just-In-Time (JIT) para tipos y miembros a los que se tiene acceso por el lenguaje intermedio de Microsoft (MSIL) del método dinámico.
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Reflection::Module ^ m, bool skipVisibility);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes, System.Reflection.Module m, bool skipVisibility);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes, System.Reflection.Module m, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * System.Reflection.Module * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), m As Module, skipVisibility As Boolean)
Parámetros
- name
- String
Nombre del método dinámico. Esto puede ser una cadena de longitud cero, pero no puede ser null
.
- returnType
- Type
Un objeto Type que especifica el tipo de valor devuelto del método dinámico o null
si el método no tiene ningún tipo de valor devuelto.
- parameterTypes
- Type[]
Matriz de objetos Type que especifican los tipos de los parámetros del método dinámico, o null
si el método no tiene parámetros.
- m
- Module
Module que representa el módulo con el que se va a asociar de manera lógica al método dinámico.
- skipVisibility
- Boolean
true
para omitir las comprobaciones de visibilidad JIT en tipos y miembros a los que accede el MSIL del método dinámico.
Excepciones
Un elemento de parameterTypes
es null
o Void.
o bien
m
es un módulo que proporciona hospedaje anónimo para los métodos dinámicos.
Versiones de .NET Framework y .NET Core anteriores a 2.1: returnType
es un tipo para el que IsByRef devuelve true
.
Comentarios
Este constructor especifica los MethodAttributes.Public atributos de método y MethodAttributes.Static, y la convención CallingConventions.Standardde llamada .
El método dinámico creado con este constructor tiene acceso a miembros públicos y internal
(Friend
en Visual Basic) de todos los tipos del módulo m
contenido. Omitir las comprobaciones de visibilidad del compilador JIT permite que el método dinámico acceda también a miembros privados y protegidos de todos los demás tipos. Esto es útil, por ejemplo, al escribir código para serializar objetos.
Nota
Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con la SecurityPermissionFlag.ControlEvidence marca si se cumplen las condiciones siguientes: m
es un módulo distinto del módulo que realiza la llamada y se ha producido un error en la demanda de ReflectionPermission con la ReflectionPermissionFlag.MemberAccess marca . Si la demanda de SecurityPermission se realiza correctamente, se permite la operación.
Consulte también
Se aplica a
DynamicMethod(String, Type, Type[], Type, Boolean)
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
Crea un método dinámico que especifica el nombre del método, el tipo de valor de devolución, los tipos de parámetros, el tipo con el que está asociado lógicamente el método dinámico y si se deben omitir comprobaciones de visibilidad Just-In-Time (JIT) para los tipos y miembros a los que se tiene acceso mediante el lenguaje intermedio de Microsoft (MSIL) del método dinámico.
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, Type ^ owner, bool skipVisibility);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes, Type owner, bool skipVisibility);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * Type * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), owner As Type, skipVisibility As Boolean)
Parámetros
- name
- String
Nombre del método dinámico. Esto puede ser una cadena de longitud cero, pero no puede ser null
.
- returnType
- Type
Un objeto Type que especifica el tipo de valor devuelto del método dinámico o null
si el método no tiene ningún tipo de valor devuelto.
- parameterTypes
- Type[]
Matriz de objetos Type que especifican los tipos de los parámetros del método dinámico, o null
si el método no tiene parámetros.
- owner
- Type
Type con el que está asociado lógicamente el método dinámico. El método dinámico tiene acceso a todos los miembros del tipo.
- skipVisibility
- Boolean
true
para omitir las comprobaciones de visibilidad JIT en tipos y miembros a los que obtiene acceso el MSIL del método dinámico; en otro caso, false
.
Excepciones
Un elemento de parameterTypes
es null
o Void.
o bien
owner
es una interfaz, una matriz, un tipo genérico abierto o un parámetro de tipo de un tipo o método genérico.
Versiones de .NET Framework y .NET Core anteriores a 2.1: returnType
es un tipo para el que IsByRef devuelve true
.
Comentarios
El método dinámico creado con este constructor tiene acceso a todos los miembros del tipo owner
, y a los miembros públicos y internal
(Friend
en Visual Basic) de todos los demás tipos del módulo que contiene owner
. Omitir las comprobaciones de visibilidad del compilador JIT permite que el método dinámico acceda también a miembros privados y protegidos de todos los demás tipos. Esto es útil, por ejemplo, al escribir código para serializar objetos.
Este constructor especifica los MethodAttributes.Public atributos de método y MethodAttributes.Static, y la convención CallingConventions.Standardde llamada .
Nota
Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con la SecurityPermissionFlag.ControlEvidence marca si se cumplen las condiciones siguientes: owner
se encuentra en un módulo distinto del módulo que realiza la llamada y se ha producido un error en la demanda de ReflectionPermission con la ReflectionPermissionFlag.MemberAccess marca . Si la demanda de SecurityPermission se realiza correctamente, se permite la operación.
Consulte también
Se aplica a
DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Module, Boolean)
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
Crea un método dinámico que es global para un módulo, especificando el nombre del método, los atributos, la convención de nomenclatura, el tipo de valor devuelto, los tipos de parámetros, el módulo y si se deben omitir comprobaciones de visibilidad Just-In-Time (JIT) para tipos y miembros a los que se tiene acceso por el lenguaje intermedio de Microsoft (MSIL) del método dinámico.
public:
DynamicMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Reflection::Module ^ m, bool skipVisibility);
public DynamicMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes, System.Reflection.Module m, bool skipVisibility);
public DynamicMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes, System.Reflection.Module m, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * System.Reflection.Module * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, parameterTypes As Type(), m As Module, skipVisibility As Boolean)
Parámetros
- name
- String
Nombre del método dinámico. Esto puede ser una cadena de longitud cero, pero no puede ser null
.
- attributes
- MethodAttributes
Combinación bit a bit de valores MethodAttributes que especifica los atributos del método dinámico. La única combinación permitida es Public y Static.
- callingConvention
- CallingConventions
La convención de llamada para el método dinámico. Debe ser Standard.
- returnType
- Type
Un objeto Type que especifica el tipo de valor devuelto del método dinámico o null
si el método no tiene ningún tipo de valor devuelto.
- parameterTypes
- Type[]
Matriz de objetos Type que especifican los tipos de los parámetros del método dinámico, o null
si el método no tiene parámetros.
- m
- Module
Module que representa el módulo con el que se va a asociar de manera lógica al método dinámico.
- skipVisibility
- Boolean
true
para omitir las comprobaciones de visibilidad JIT en tipos y miembros a los que obtiene acceso el MSIL del método dinámico; en otro caso, false
.
Excepciones
Un elemento de parameterTypes
es null
o Void.
o bien
m
es un módulo que proporciona hospedaje anónimo para los métodos dinámicos.
attributes
es una combinación de indicadores distinta de Public y Static.
o bien
callingConvention
no es Standard.
o bien
returnType
es un tipo para el que IsByRef devuelve true
.
Comentarios
El método dinámico creado con este constructor tiene acceso a miembros públicos y internal
(Friend
en Visual Basic) de todos los tipos públicos e internos contenidos en el módulo m
.
Omitir las comprobaciones de visibilidad del compilador JIT permite que el método dinámico acceda también a miembros privados y protegidos de todos los demás tipos del módulo y en todos los demás ensamblados. Esto es útil, por ejemplo, al escribir código para serializar objetos.
Nota
Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con la SecurityPermissionFlag.ControlEvidence marca si se cumplen las condiciones siguientes: m
es un módulo distinto del módulo que realiza la llamada y se ha producido un error en la demanda de ReflectionPermission con la ReflectionPermissionFlag.MemberAccess marca . Si la demanda de SecurityPermission se realiza correctamente, se permite la operación.
Consulte también
Se aplica a
DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type, Boolean)
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
- Source:
- DynamicMethod.cs
Crea un método dinámico que especifica el nombre del método, los atributos, la convención de llamada, el tipo de valor de devolución, los tipos de parámetros, el tipo con el que está asociado lógicamente el método dinámico y si se deben omitir comprobaciones de visibilidad Just-In-Time (JIT) para los tipos y miembros a los que se tiene acceso mediante el lenguaje intermedio de Microsoft (MSIL) del método dinámico.
public:
DynamicMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, Type ^ owner, bool skipVisibility);
public DynamicMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes, Type owner, bool skipVisibility);
public DynamicMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * Type * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, parameterTypes As Type(), owner As Type, skipVisibility As Boolean)
Parámetros
- name
- String
Nombre del método dinámico. Esto puede ser una cadena de longitud cero, pero no puede ser null
.
- attributes
- MethodAttributes
Combinación bit a bit de valores MethodAttributes que especifica los atributos del método dinámico. La única combinación permitida es Public y Static.
- callingConvention
- CallingConventions
La convención de llamada para el método dinámico. Debe ser Standard.
- returnType
- Type
Un objeto Type que especifica el tipo de valor devuelto del método dinámico o null
si el método no tiene ningún tipo de valor devuelto.
- parameterTypes
- Type[]
Matriz de objetos Type que especifican los tipos de los parámetros del método dinámico, o null
si el método no tiene parámetros.
- owner
- Type
Type con el que está asociado lógicamente el método dinámico. El método dinámico tiene acceso a todos los miembros del tipo.
- skipVisibility
- Boolean
true
para omitir las comprobaciones de visibilidad JIT en tipos y miembros a los que obtiene acceso el MSIL del método dinámico; en otro caso, false
.
Excepciones
Un elemento de parameterTypes
es null
o Void.
o bien
owner
es una interfaz, una matriz, un tipo genérico abierto o un parámetro de tipo de un tipo o método genérico.
attributes
es una combinación de indicadores distinta de Public y Static.
o bien
callingConvention
no es Standard.
o bien
returnType
es un tipo para el que IsByRef devuelve true
.
Comentarios
El método dinámico es global para el módulo que contiene el tipo owner
. Tiene acceso a todos los miembros del tipo owner
.
El método dinámico creado con este constructor tiene acceso a todos los miembros del tipo owner
, y a los miembros públicos y internal
(Friend
en Visual Basic) de todos los tipos contenidos en el módulo que contiene owner
. Omitir las comprobaciones de visibilidad del compilador JIT permite que el método dinámico acceda también a miembros privados y protegidos de todos los demás tipos. Esto es útil, por ejemplo, al escribir código para serializar objetos.
Nota
Para la compatibilidad con versiones anteriores, este constructor exige SecurityPermission con la SecurityPermissionFlag.ControlEvidence marca si se cumplen las condiciones siguientes: owner
se encuentra en un módulo distinto del módulo que realiza la llamada y se ha producido un error en la demanda de ReflectionPermission con la ReflectionPermissionFlag.MemberAccess marca . Si la demanda de SecurityPermission se realiza correctamente, se permite la operación.