Ler en inglés

Compartir por


AppDomain.DefineDynamicAssembly Método

Definición

Define un ensamblado dinámico en el dominio de aplicación actual.

Sobrecargas

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean, IEnumerable<CustomAttributeBuilder>)
Obsoletos.

Define un ensamblado dinámico con el nombre especificado, el modo de acceso, el directorio de almacenamiento, la evidencia, las solicitudes de permiso, la opción de sincronización y los atributos personalizados.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean)
Obsoletos.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso, el directorio de almacenamiento, la evidencia, las solicitudes de permiso y la opción de sincronización.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet)
Obsoletos.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso, el directorio de almacenamiento, la evidencia y las solicitudes de permiso.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, PermissionSet, PermissionSet, PermissionSet)
Obsoletos.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso, el directorio de almacenamiento y las solicitudes de permiso.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence, PermissionSet, PermissionSet, PermissionSet)
Obsoletos.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso, la evidencia y las solicitudes de permiso.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Boolean, IEnumerable<CustomAttributeBuilder>)

Define un ensamblado dinámico usando el nombre, el modo de acceso, el directorio de almacenamiento y la opción de sincronización especificados.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, PermissionSet, PermissionSet, PermissionSet)
Obsoletos.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso y las solicitudes de permiso.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence)
Obsoletos.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso, el directorio de almacenamiento y la evidencia.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>, SecurityContextSource)

Define un ensamblado dinámico con el nombre, el modo de acceso y los atributos personalizados especificados, y usando el origen indicado para su contexto de seguridad.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String)

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso y el directorio de almacenamiento.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence)
Obsoletos.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso y la evidencia.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>)

Define un ensamblado dinámico con el nombre especificado, el modo de acceso y los atributos personalizados.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess)

Define un ensamblado dinámico con el nombre y modo de acceso especificados.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean, IEnumerable<CustomAttributeBuilder>)

Precaución

Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.

Define un ensamblado dinámico con el nombre especificado, el modo de acceso, el directorio de almacenamiento, la evidencia, las solicitudes de permiso, la opción de sincronización y los atributos personalizados.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.Policy.Evidence evidence, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions, bool isSynchronized, System.Collections.Generic.IEnumerable<System.Reflection.Emit.CustomAttributeBuilder> assemblyAttributes);
C#
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.Policy.Evidence evidence, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions, bool isSynchronized, System.Collections.Generic.IEnumerable<System.Reflection.Emit.CustomAttributeBuilder> assemblyAttributes);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso al ensamblado dinámico.

dir
String

Nombre del directorio donde se guardará el ensamblado dinámico. Si dir es null, se usa el directorio actual.

evidence
Evidence

Evidencia suministrada para el ensamblado dinámico. La evidencia se usa sin modificaciones como conjunto final de evidencia para la resolución de directivas.

requiredPermissions
PermissionSet

Solicitud de permisos requeridos.

optionalPermissions
PermissionSet

Solicitud de permisos opcionales.

refusedPermissions
PermissionSet

Solicitud de permisos rechazados.

isSynchronized
Boolean

true para sincronizar la creación de módulos, tipos y miembros en el ensamblado dinámico; en caso contrario, false.

assemblyAttributes
IEnumerable<CustomAttributeBuilder>

Lista enumerable de atributos que se va a aplicarse al ensamblado o null si no hay ningún atributo.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Atributos

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Comentarios

Use esta sobrecarga de método para especificar atributos que no funcionan correctamente a menos que se apliquen cuando se cree un ensamblado dinámico. Por ejemplo, los atributos de seguridad como SecurityTransparentAttribute y SecurityCriticalAttribute no funcionan correctamente si se agregan después de crear un ensamblado dinámico.

Las solicitudes de permiso especificadas para los requiredPermissionsparámetros , optionalPermissionsy refusedPermissions solo se usan si el evidence parámetro también se proporciona, o si el ensamblado dinámico se guarda y se vuelve a cargar en la memoria.

Nota

Al desarrollar código que emite ensamblados dinámicos, se recomienda incluir la SecurityPermissionFlag.SkipVerification marca en el refusedPermissions parámetro . La inclusión de esta marca garantiza que se comprobará el lenguaje intermedio de Microsoft (MSIL). Esta técnica detectará la generación involuntaria de código no comprobable, lo que de lo contrario es muy difícil de detectar. Una limitación de esta técnica es que también hace SecurityException que se produzca cuando se usa con código que exige plena confianza.

Solo los autores de llamadas de plena confianza pueden proporcionar evidencia al definir un elemento dinámico Assembly. El tiempo de ejecución asigna a Evidence través de la directiva de seguridad para determinar los permisos concedidos. Los autores de llamadas de confianza parcial deben proporcionar null para el evidence parámetro . Si evidence es null, el tiempo de ejecución copia los conjuntos de permisos (es decir, los conjuntos de concesión y denegación actuales) del ensamblado del autor de la llamada al ensamblado dinámico que se está definiendo y marca la directiva como resuelta.

Si el ensamblado dinámico se guarda en el disco, las cargas posteriores obtendrán concesiones basadas en directivas asociadas a la ubicación donde se guardó el ensamblado dinámico.

Si isSynchronized es true, los métodos siguientes del resultante AssemblyBuilder se sincronizarán: DefineDynamicModule, DefineResource, AddResourceFile, GetDynamicModule, SetEntryPointy Save. Si se llama a dos de estos métodos en subprocesos diferentes, uno se bloqueará hasta que se complete el otro.

Esta sobrecarga de método se introduce en .NET Framework 3.5.

Consulte también

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións (Obsoleto)
.NET Framework 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean)

Precaución

Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso, el directorio de almacenamiento, la evidencia, las solicitudes de permiso y la opción de sincronización.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.Policy.Evidence evidence, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions, bool isSynchronized);
C#
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.Policy.Evidence evidence, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions, bool isSynchronized);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso al ensamblado dinámico.

dir
String

Nombre del directorio donde se guardará el ensamblado dinámico. Si dir es null, el directorio predeterminado es el directorio actual.

evidence
Evidence

Evidencia suministrada para el ensamblado dinámico. La evidencia se usa sin modificaciones como conjunto final de evidencia para la resolución de directivas.

requiredPermissions
PermissionSet

Solicitud de permisos requeridos.

optionalPermissions
PermissionSet

Solicitud de permisos opcionales.

refusedPermissions
PermissionSet

Solicitud de permisos rechazados.

isSynchronized
Boolean

true para sincronizar la creación de módulos, tipos y miembros en el ensamblado dinámico; en caso contrario, false.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Implementaciones

Atributos

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Ejemplos

En el ejemplo siguiente se muestra el método y AssemblyResolve el DefineDynamicAssembly evento .

Para que se ejecute este ejemplo de código, debe proporcionar el nombre completo del ensamblado. Para obtener información sobre cómo obtener el nombre completo del ensamblado, vea Nombres de ensamblado.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

class DefinedDynamicAssemblySnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyDynamicType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

      InstantiateMyDynamicType(currentDomain);   // OK!
   }

   static void InstantiateMyDynamicType(AppDomain domain) {
      try {
         // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
      return DefineDynamicAssembly((AppDomain) sender);
   }

   static Assembly DefineDynamicAssembly(AppDomain domain) {
      // Build a dynamic assembly using Reflection Emit API.

      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyDynamicAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule");
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public);
      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();

      ilGenerator.EmitWriteLine("MyDynamicType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      return assemblyBuilder;
   }
}

Comentarios

Las solicitudes de permiso especificadas para requiredPermissions, optionalPermissionsy refusedPermissions solo se usan si evidence también se proporciona, o si el ensamblado dinámico se guarda y se vuelve a cargar en la memoria.

Nota

Durante el desarrollo de código que emite ensamblados dinámicos, se recomienda incluir SecurityPermissionFlag.SkipVerification en refusedPermissions. Incluir SkipVerification en el refusedPermissions parámetro garantiza que se compruebe el MSIL. Una limitación de esta técnica es que también SecurityException hace que se produzca cuando se usa con código que exige plena confianza.

Solo los autores de llamadas de plena confianza pueden proporcionar su evidencia al definir una dinámica Assembly. El entorno de ejecución asignará a Evidence través de la directiva de seguridad para determinar los permisos concedidos. Los autores de llamadas de confianza parcial deben proporcionar null para el evidence parámetro . Si evidence es null, el tiempo de ejecución copia los conjuntos de permisos, es decir, los conjuntos de concesión y denegación actuales, del autor Assembly de la llamada a la directiva dinámica Assembly que se define y marca la directiva como resuelta.

Si la dinámica Assembly se guarda en el disco, las cargas posteriores obtendrán concesiones basadas en las directivas asociadas a la ubicación donde Assembly se guardó.

Si isSynchronized es true, los métodos siguientes del resultante AssemblyBuilder se sincronizarán: DefineDynamicModule, DefineResource, AddResourceFile, GetDynamicModule, SetEntryPointy Save. Si se llama a dos de estos métodos en subprocesos diferentes, uno se bloqueará hasta que se complete el otro.

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións (Obsoleto)
.NET Framework 1.1, 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet)

Precaución

Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. Please see http://go.microsoft.com/fwlink/?LinkId=155570 for more information.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso, el directorio de almacenamiento, la evidencia y las solicitudes de permiso.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.Policy.Evidence evidence, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions);
C#
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default.  Please see http://go.microsoft.com/fwlink/?LinkId=155570 for more information.")]
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.Policy.Evidence evidence, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso al ensamblado dinámico.

dir
String

Nombre del directorio donde se guardará el ensamblado. Si dir es null, el directorio predeterminado es el directorio actual.

evidence
Evidence

Evidencia suministrada para el ensamblado dinámico. La evidencia se usa sin modificaciones como conjunto final de evidencia para la resolución de directivas.

requiredPermissions
PermissionSet

Solicitud de permisos requeridos.

optionalPermissions
PermissionSet

Solicitud de permisos opcionales.

refusedPermissions
PermissionSet

Solicitud de permisos rechazados.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Implementaciones

Atributos

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Ejemplos

En el ejemplo siguiente se muestra el método y AssemblyResolve el DefineDynamicAssembly evento .

Para que se ejecute este ejemplo de código, debe proporcionar el nombre completo del ensamblado. Para obtener información sobre cómo obtener el nombre completo del ensamblado, vea Nombres de ensamblado.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

class DefinedDynamicAssemblySnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyDynamicType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

      InstantiateMyDynamicType(currentDomain);   // OK!
   }

   static void InstantiateMyDynamicType(AppDomain domain) {
      try {
         // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
      return DefineDynamicAssembly((AppDomain) sender);
   }

   static Assembly DefineDynamicAssembly(AppDomain domain) {
      // Build a dynamic assembly using Reflection Emit API.

      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyDynamicAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule");
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public);
      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();

      ilGenerator.EmitWriteLine("MyDynamicType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      return assemblyBuilder;
   }
}

Comentarios

Las solicitudes de permiso especificadas para requiredPermissions, optionalPermissionsy refusedPermissions solo se usan si evidence también se proporciona, o si el ensamblado dinámico se guarda y se vuelve a cargar en la memoria.

Nota

Durante el desarrollo de código que emite ensamblados dinámicos, se recomienda incluir SecurityPermissionFlag.SkipVerification en refusedPermissions. Incluir SkipVerification en el refusedPermissions parámetro garantiza que se compruebe el MSIL. Una limitación de esta técnica es que también SecurityException hace que se produzca cuando se usa con código que exige plena confianza.

Solo los autores de llamadas de plena confianza pueden proporcionar sus al evidence definir un elemento dinámico Assembly. El entorno de ejecución asignará a Evidence través de la directiva de seguridad para determinar los permisos concedidos. Los autores de llamadas de confianza parcial deben proporcionar un valor NULL evidence. Si evidence es null, el tiempo de ejecución copia los conjuntos de permisos, es decir, los conjuntos de concesión y denegación actuales, del autor Assembly de la llamada a la directiva dinámica Assembly que se define y marca la directiva como resuelta.

Si la dinámica Assembly se guarda en el disco, las cargas posteriores obtendrán concesiones basadas en las directivas asociadas a la ubicación donde Assembly se guardó.

Este método solo se debe usar para definir un ensamblado dinámico en el dominio de aplicación actual. Para obtener más información, consulte la sobrecarga del Load(AssemblyName) método.

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións (Obsoleto)
.NET Framework 1.1, 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, PermissionSet, PermissionSet, PermissionSet)

Precaución

Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso, el directorio de almacenamiento y las solicitudes de permiso.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions);
C#
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso al ensamblado dinámico.

dir
String

Nombre del directorio donde se guardará el ensamblado. Si dir es null, el directorio predeterminado es el directorio actual.

requiredPermissions
PermissionSet

Solicitud de permisos requeridos.

optionalPermissions
PermissionSet

Solicitud de permisos opcionales.

refusedPermissions
PermissionSet

Solicitud de permisos rechazados.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Implementaciones

Atributos

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Ejemplos

En el ejemplo siguiente se muestra el método y AssemblyResolve el DefineDynamicAssembly evento .

Para que se ejecute este ejemplo de código, debe proporcionar el nombre completo del ensamblado. Para obtener información sobre cómo obtener el nombre completo del ensamblado, vea Nombres de ensamblado.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

class DefinedDynamicAssemblySnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyDynamicType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

      InstantiateMyDynamicType(currentDomain);   // OK!
   }

   static void InstantiateMyDynamicType(AppDomain domain) {
      try {
         // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
      return DefineDynamicAssembly((AppDomain) sender);
   }

   static Assembly DefineDynamicAssembly(AppDomain domain) {
      // Build a dynamic assembly using Reflection Emit API.

      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyDynamicAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule");
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public);
      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();

      ilGenerator.EmitWriteLine("MyDynamicType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      return assemblyBuilder;
   }
}

Comentarios

Las solicitudes de permisos especificadas para requiredPermissions, optionalPermissionsy refusedPermissions no se usan a menos que el ensamblado dinámico se haya guardado y vuelto a cargar en la memoria. Para especificar solicitudes de permisos para un ensamblado transitorio que nunca se guarda en el disco, use una sobrecarga del DefineDynamicAssembly método que especifica evidencias, así como permisos solicitados, y proporcione un Evidence objeto .

Nota

Durante el desarrollo de código que emite ensamblados dinámicos, se recomienda usar una sobrecarga del DefineDynamicAssembly método que especifica la evidencia y los permisos, proporcionar la evidencia que desea que tenga el ensamblado dinámico e incluir SecurityPermissionFlag.SkipVerification en refusedPermissions. Incluir SkipVerification en el refusedPermissions parámetro garantiza que se compruebe el MSIL. Una limitación de esta técnica es que también SecurityException hace que se produzca cuando se usa con código que exige plena confianza.

Este método solo se debe usar para definir un ensamblado dinámico en el dominio de aplicación actual. Para obtener más información, consulte la sobrecarga del Load(AssemblyName) método.

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións (Obsoleto)
.NET Framework 1.1, 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence, PermissionSet, PermissionSet, PermissionSet)

Precaución

Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso, la evidencia y las solicitudes de permiso.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, System.Security.Policy.Evidence evidence, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions);
C#
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, System.Security.Policy.Evidence evidence, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso al ensamblado dinámico.

evidence
Evidence

Evidencia suministrada para el ensamblado dinámico. La evidencia se usa sin modificaciones como conjunto final de evidencia para la resolución de directivas.

requiredPermissions
PermissionSet

Solicitud de permisos requeridos.

optionalPermissions
PermissionSet

Solicitud de permisos opcionales.

refusedPermissions
PermissionSet

Solicitud de permisos rechazados.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Implementaciones

Atributos

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Ejemplos

En el ejemplo siguiente se muestra el método y AssemblyResolve el DefineDynamicAssembly evento .

Para que se ejecute este ejemplo de código, debe proporcionar el nombre completo del ensamblado. Para obtener información sobre cómo obtener el nombre completo del ensamblado, vea Nombres de ensamblado.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

class DefinedDynamicAssemblySnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyDynamicType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

      InstantiateMyDynamicType(currentDomain);   // OK!
   }

   static void InstantiateMyDynamicType(AppDomain domain) {
      try {
         // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
      return DefineDynamicAssembly((AppDomain) sender);
   }

   static Assembly DefineDynamicAssembly(AppDomain domain) {
      // Build a dynamic assembly using Reflection Emit API.

      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyDynamicAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule");
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public);
      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();

      ilGenerator.EmitWriteLine("MyDynamicType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      return assemblyBuilder;
   }
}

Comentarios

Las solicitudes de permiso especificadas para requiredPermissions, optionalPermissionsy refusedPermissions solo se usan si evidence también se proporciona, o si el ensamblado dinámico se guarda y se vuelve a cargar en la memoria.

Nota

Durante el desarrollo de código que emite ensamblados dinámicos, se recomienda incluir SecurityPermissionFlag.SkipVerification en refusedPermissions. Incluir SkipVerification en el refusedPermissions parámetro garantiza que se compruebe el MSIL. Una limitación de esta técnica es que también SecurityException hace que se produzca cuando se usa con código que exige plena confianza.

Solo los autores de llamadas de plena confianza pueden proporcionar sus al evidence definir un elemento dinámico Assembly. El entorno de ejecución asignará a Evidence través de la directiva de seguridad para determinar los permisos concedidos. Los autores de llamadas de confianza parcial deben proporcionar un valor NULL evidence. Si evidence es null, el tiempo de ejecución copia los conjuntos de permisos, es decir, los conjuntos de concesión y denegación actuales, del autor Assembly de la llamada a la directiva dinámica Assembly que se define y marca la directiva como resuelta.

Si la dinámica Assembly se guarda en el disco, las cargas posteriores obtendrán concesiones basadas en las directivas asociadas a la ubicación donde Assembly se guardó.

Este método solo se debe usar para definir un ensamblado dinámico en el dominio de aplicación actual. Para obtener más información, consulte la sobrecarga del Load(AssemblyName) método.

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións (Obsoleto)
.NET Framework 1.1, 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Boolean, IEnumerable<CustomAttributeBuilder>)

Define un ensamblado dinámico usando el nombre, el modo de acceso, el directorio de almacenamiento y la opción de sincronización especificados.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, bool isSynchronized, System.Collections.Generic.IEnumerable<System.Reflection.Emit.CustomAttributeBuilder> assemblyAttributes);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso al ensamblado dinámico.

dir
String

Nombre del directorio donde se guardará el ensamblado dinámico. Si dir es null, se usa el directorio actual.

isSynchronized
Boolean

true para sincronizar la creación de módulos, tipos y miembros en el ensamblado dinámico; en caso contrario, false.

assemblyAttributes
IEnumerable<CustomAttributeBuilder>

Lista enumerable de atributos que se va a aplicarse al ensamblado o null si no hay ningún atributo.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Comentarios

Use esta sobrecarga de método para especificar atributos que no funcionan correctamente a menos que se apliquen cuando se cree un ensamblado dinámico. Por ejemplo, los atributos de seguridad como SecurityTransparentAttribute y SecurityCriticalAttribute no funcionan correctamente si se agregan después de crear un ensamblado dinámico.

Si isSynchronized es true, los métodos siguientes del resultante AssemblyBuilder se sincronizarán: DefineDynamicModule, DefineResource, AddResourceFile, GetDynamicModule, SetEntryPointy Save. Si se llama a dos de estos métodos en subprocesos diferentes, uno se bloqueará hasta que se complete el otro.

Consulte también

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, PermissionSet, PermissionSet, PermissionSet)

Precaución

Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso y las solicitudes de permiso.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions);
C#
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default.  See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, System.Security.PermissionSet requiredPermissions, System.Security.PermissionSet optionalPermissions, System.Security.PermissionSet refusedPermissions);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso al ensamblado dinámico.

requiredPermissions
PermissionSet

Solicitud de permisos requeridos.

optionalPermissions
PermissionSet

Solicitud de permisos opcionales.

refusedPermissions
PermissionSet

Solicitud de permisos rechazados.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Implementaciones

Atributos

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Ejemplos

En el ejemplo siguiente se muestra el método y AssemblyResolve el DefineDynamicAssembly evento .

Para que se ejecute este ejemplo de código, debe proporcionar el nombre completo del ensamblado. Para obtener información sobre cómo obtener el nombre completo del ensamblado, vea Nombres de ensamblado.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

class DefinedDynamicAssemblySnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyDynamicType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

      InstantiateMyDynamicType(currentDomain);   // OK!
   }

   static void InstantiateMyDynamicType(AppDomain domain) {
      try {
         // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
      return DefineDynamicAssembly((AppDomain) sender);
   }

   static Assembly DefineDynamicAssembly(AppDomain domain) {
      // Build a dynamic assembly using Reflection Emit API.

      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyDynamicAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule");
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public);
      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();

      ilGenerator.EmitWriteLine("MyDynamicType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      return assemblyBuilder;
   }
}

Comentarios

Las solicitudes de permiso especificadas para requiredPermissions, optionalPermissionsy refusedPermissions no se usan a menos que el ensamblado dinámico se haya guardado y vuelto a cargar en la memoria. Para especificar solicitudes de permisos para un ensamblado transitorio que nunca se guarda en el disco, use una sobrecarga del DefineDynamicAssembly método que especifica evidencia, así como permisos solicitados, y proporcione un Evidence objeto .

Nota

Durante el desarrollo de código que emite ensamblados dinámicos, se recomienda usar una sobrecarga del DefineDynamicAssembly método que especifica evidencia y permisos, proporcionar la evidencia que desea que tenga el ensamblado dinámico e incluir SecurityPermissionFlag.SkipVerification en refusedPermissions. La inclusión SkipVerification en el refusedPermissions parámetro garantiza que se compruebe el MSIL. Una limitación de esta técnica es que también hace SecurityException que se produzca cuando se use con código que requiera plena confianza.

Este método solo se debe usar para definir un ensamblado dinámico en el dominio de aplicación actual. Para obtener más información, vea la sobrecarga del Load(AssemblyName) método .

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións (Obsoleto)
.NET Framework 1.1, 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence)

Precaución

Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of DefineDynamicAssembly which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkId=155570 for more information.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso, el directorio de almacenamiento y la evidencia.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.Policy.Evidence evidence);
C#
[System.Obsolete("Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of DefineDynamicAssembly which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkId=155570 for more information.")]
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.Policy.Evidence evidence);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso al ensamblado dinámico.

dir
String

Nombre del directorio donde se guardará el ensamblado. Si dir es null, el directorio predeterminado es el directorio actual.

evidence
Evidence

Evidencia suministrada para el ensamblado dinámico. La evidencia se usa sin modificaciones como conjunto final de evidencia para la resolución de directivas.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Implementaciones

Atributos

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Ejemplos

En el ejemplo siguiente se muestra el método y AssemblyResolve el DefineDynamicAssembly evento .

Para que se ejecute este ejemplo de código, debe proporcionar el nombre completo del ensamblado. Para obtener información sobre cómo obtener el nombre completo del ensamblado, vea Nombres de ensamblado.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

class DefinedDynamicAssemblySnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyDynamicType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

      InstantiateMyDynamicType(currentDomain);   // OK!
   }

   static void InstantiateMyDynamicType(AppDomain domain) {
      try {
         // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
      return DefineDynamicAssembly((AppDomain) sender);
   }

   static Assembly DefineDynamicAssembly(AppDomain domain) {
      // Build a dynamic assembly using Reflection Emit API.

      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyDynamicAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule");
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public);
      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();

      ilGenerator.EmitWriteLine("MyDynamicType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      return assemblyBuilder;
   }
}

Comentarios

Solo los autores de llamadas de plena confianza pueden proporcionar sus evidence elementos al definir un dinámico Assembly. El tiempo de ejecución asignará mediante Evidence la directiva de seguridad para determinar los permisos concedidos. Los autores de llamadas de confianza parcial deben proporcionar un valor NULL evidence. Si evidence es null, el tiempo de ejecución copia los conjuntos de permisos, es decir, los conjuntos de concesión y denegación actuales, del autor de la llamada Assembly a la directiva Assembly dinámica que se define y marca como resuelta.

Si la dinámica Assembly se guarda en el disco, las cargas posteriores obtendrán concesiones en función de las directivas asociadas a la ubicación donde Assembly se guardó.

Este método solo se debe usar para definir un ensamblado dinámico en el dominio de aplicación actual. Para obtener más información, consulte la sobrecarga del Load(AssemblyName) método.

Nota

Durante el desarrollo de código que emite ensamblados dinámicos, se recomienda usar una sobrecarga del DefineDynamicAssembly método que especifica evidencia y permisos, proporcionar la evidencia que desea que tenga el ensamblado dinámico e incluir SecurityPermissionFlag.SkipVerification en refusedPermissions. La inclusión SkipVerification en el refusedPermissions parámetro garantiza que se compruebe el MSIL. Una limitación de esta técnica es que también hace SecurityException que se produzca cuando se use con código que requiera plena confianza.

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións (Obsoleto)
.NET Framework 1.1, 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>, SecurityContextSource)

Define un ensamblado dinámico con el nombre, el modo de acceso y los atributos personalizados especificados, y usando el origen indicado para su contexto de seguridad.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, System.Collections.Generic.IEnumerable<System.Reflection.Emit.CustomAttributeBuilder> assemblyAttributes, System.Security.SecurityContextSource securityContextSource);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso del ensamblado dinámico.

assemblyAttributes
IEnumerable<CustomAttributeBuilder>

Lista enumerable de atributos que se va a aplicarse al ensamblado o null si no hay ningún atributo.

securityContextSource
SecurityContextSource

Origen del contexto de seguridad.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

El valor de securityContextSource no era ninguno de los valores de enumeración.

Comentarios

Use esta sobrecarga de método para especificar atributos que no funcionan correctamente a menos que se apliquen cuando se cree un ensamblado dinámico. Por ejemplo, los atributos de seguridad como SecurityTransparentAttribute y SecurityCriticalAttribute no funcionan correctamente si se agregan después de crear un ensamblado dinámico.

Este método solo se debe usar para definir un ensamblado dinámico en el dominio de aplicación actual. Para obtener más información sobre esta restricción, consulte la sobrecarga del Load(AssemblyName) método.

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String)

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso y el directorio de almacenamiento.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso al ensamblado dinámico.

dir
String

Nombre del directorio donde se guardará el ensamblado. Si dir es null, el directorio predeterminado es el directorio actual.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Implementaciones

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Ejemplos

En el ejemplo siguiente se muestra el método y AssemblyResolve el DefineDynamicAssembly evento .

Para que se ejecute este ejemplo de código, debe proporcionar el nombre completo del ensamblado. Para obtener información sobre cómo obtener el nombre completo del ensamblado, vea Nombres de ensamblado.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

class DefinedDynamicAssemblySnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyDynamicType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

      InstantiateMyDynamicType(currentDomain);   // OK!
   }

   static void InstantiateMyDynamicType(AppDomain domain) {
      try {
         // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
      return DefineDynamicAssembly((AppDomain) sender);
   }

   static Assembly DefineDynamicAssembly(AppDomain domain) {
      // Build a dynamic assembly using Reflection Emit API.

      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyDynamicAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule");
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public);
      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();

      ilGenerator.EmitWriteLine("MyDynamicType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      return assemblyBuilder;
   }
}

Comentarios

Este método solo se debe usar para definir un ensamblado dinámico en el dominio de aplicación actual. Para obtener más información, consulte la sobrecarga del Load(AssemblyName) método.

Nota

Durante el desarrollo de código que emite ensamblados dinámicos, se recomienda usar una sobrecarga del DefineDynamicAssembly método que especifica evidencia y permisos, proporcionar la evidencia que desea que tenga el ensamblado dinámico e incluir SecurityPermissionFlag.SkipVerification en refusedPermissions. La inclusión SkipVerification en el refusedPermissions parámetro garantiza que se compruebe el MSIL. Una limitación de esta técnica es que también hace SecurityException que se produzca cuando se use con código que requiera plena confianza.

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence)

Precaución

Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.

Define un ensamblado dinámico usando el nombre especificado, el modo de acceso y la evidencia.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, System.Security.Policy.Evidence evidence);
C#
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default.  See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, System.Security.Policy.Evidence evidence);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso al ensamblado dinámico.

evidence
Evidence

Evidencia suministrada para el ensamblado dinámico. La evidencia se usa sin modificaciones como conjunto final de evidencia para la resolución de directivas.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Implementaciones

Atributos

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Ejemplos

En el ejemplo siguiente se muestra el DefineDynamicAssembly método y el AssemblyResolve evento .

En primer lugar, el ejemplo de código intenta crear una instancia de MyDynamicType llamando al CreateInstance método con un nombre de ensamblado no válido y detecta la excepción resultante.

A continuación, el ejemplo de código agrega un controlador de eventos para el AssemblyResolve evento y, de nuevo, intenta crear una instancia deMyDynamicType . Durante la llamada a CreateInstance, el AssemblyResolve evento se genera para el ensamblado no válido. El controlador de eventos crea un ensamblado dinámico que contiene un tipo denominado MyDynamicType, proporciona al tipo un constructor sin parámetros y devuelve el nuevo ensamblado dinámico. La llamada a CreateInstance finaliza correctamente y el constructor para MyDynamicType muestra un mensaje en la consola.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

class DefinedDynamicAssemblySnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyDynamicType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

      InstantiateMyDynamicType(currentDomain);   // OK!
   }

   static void InstantiateMyDynamicType(AppDomain domain) {
      try {
         // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
      return DefineDynamicAssembly((AppDomain) sender);
   }

   static Assembly DefineDynamicAssembly(AppDomain domain) {
      // Build a dynamic assembly using Reflection Emit API.

      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyDynamicAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule");
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public);
      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();

      ilGenerator.EmitWriteLine("MyDynamicType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      return assemblyBuilder;
   }
}

Comentarios

Solo los autores de llamadas de plena confianza pueden proporcionar sus evidence elementos al definir un dinámico Assembly. El tiempo de ejecución asignará mediante Evidence la directiva de seguridad para determinar los permisos concedidos. Los autores de llamadas de confianza parcial deben proporcionar un valor NULL evidence. Si evidence es null, el tiempo de ejecución copia los conjuntos de permisos, es decir, los conjuntos de concesión y denegación actuales, del autor de la llamada Assembly a la directiva Assembly dinámica que se define y marca como resuelta.

Si la dinámica Assembly se guarda en el disco, las cargas posteriores obtendrán concesiones en función de las directivas asociadas a la ubicación donde Assembly se guardó.

Este método solo se debe usar para definir un ensamblado dinámico en el dominio de aplicación actual. Para obtener más información, consulte la sobrecarga del Load(AssemblyName) método.

Nota

Durante el desarrollo de código que emite ensamblados dinámicos, se recomienda usar una sobrecarga del DefineDynamicAssembly método que especifica evidencia y permisos, proporcionar la evidencia que desea que tenga el ensamblado dinámico e incluir SecurityPermissionFlag.SkipVerification en refusedPermissions. La inclusión SkipVerification en el refusedPermissions parámetro garantiza que se compruebe el MSIL. Una limitación de esta técnica es que también hace SecurityException que se produzca cuando se use con código que requiera plena confianza.

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións (Obsoleto)
.NET Framework 1.1, 2.0, 3.0, 3.5 (4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1)

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>)

Define un ensamblado dinámico con el nombre especificado, el modo de acceso y los atributos personalizados.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, System.Collections.Generic.IEnumerable<System.Reflection.Emit.CustomAttributeBuilder> assemblyAttributes);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso del ensamblado dinámico.

assemblyAttributes
IEnumerable<CustomAttributeBuilder>

Lista enumerable de atributos que se va a aplicarse al ensamblado o null si no hay ningún atributo.

Devoluciones

Ensamblado dinámico con el nombre y las características especificados.

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Ejemplos

En el ejemplo de código siguiente se muestra cómo crear un ensamblado dinámico que tenga .SecurityTransparentAttribute El atributo debe especificarse como un elemento de una matriz de CustomAttributeBuilder objetos .

El primer paso para crear CustomAttributeBuilder es obtener un constructor para el atributo . El constructor no tiene parámetros, por lo que se llama al GetConstructor método con una matriz vacía de Type objetos para representar los tipos de los parámetros. El segundo paso consiste en pasar el objeto resultante ConstructorInfo al constructor de la CustomAttributeBuilder clase, junto con una matriz vacía de tipo Object para representar los argumentos.

A continuación, el resultado CustomAttributeBuilder se pasa al DefineDynamicAssembly método como el único elemento de una matriz.

El código de ejemplo define un módulo y un tipo en el nuevo ensamblado dinámico y, a continuación, muestra los atributos del ensamblado.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Security;

class CustomAttributeBuilderSnippet
{
    static void Main()
    {
        // Create a CustomAttributeBuilder for the assembly attribute.
        //
        // SecurityTransparentAttribute has a parameterless constructor,
        // which is retrieved by passing an array of empty types for the
        // constructor's parameter types. The CustomAttributeBuilder is
        // then created by passing the ConstructorInfo and an empty array
        // of objects to represent the parameters.
        //
        ConstructorInfo transparentCtor =
            typeof(SecurityTransparentAttribute).GetConstructor(
                Type.EmptyTypes);
        CustomAttributeBuilder transparent = new CustomAttributeBuilder(
            transparentCtor,
            new Object[] {} );

        // Create a dynamic assembly using the attribute. The attribute is
        // passed as an array with one element.
        AssemblyName aName = new AssemblyName("EmittedAssembly");
        AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
            aName,
            AssemblyBuilderAccess.Run,
            new CustomAttributeBuilder[] { transparent } );

        ModuleBuilder mb = ab.DefineDynamicModule( aName.Name );
        TypeBuilder tb = mb.DefineType(
            "MyDynamicType",
            TypeAttributes.Public );
        tb.CreateType();

        Console.WriteLine("{0}\nAssembly attributes:", ab);
        foreach (Attribute attr in ab.GetCustomAttributes(true))
        {
            Console.WriteLine("\t{0}", attr);
        }
    }
}

/* This code example produces the following output:

EmittedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Assembly attributes:
        System.Security.SecurityTransparentAttribute
 */

Comentarios

Use esta sobrecarga de método para especificar atributos que no funcionan correctamente a menos que se apliquen cuando se cree un ensamblado dinámico. Por ejemplo, los atributos de seguridad como SecurityTransparentAttribute y SecurityCriticalAttribute no funcionan correctamente si se agregan después de crear un ensamblado dinámico.

Este método solo se debe usar para definir un ensamblado dinámico en el dominio de aplicación actual. Para obtener más información sobre esta restricción, consulte la sobrecarga del Load(AssemblyName) método.

Esta sobrecarga de método se introduce en .NET Framework 3.5.

Consulte también

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess)

Define un ensamblado dinámico con el nombre y modo de acceso especificados.

C#
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access);

Parámetros

name
AssemblyName

Identidad única del ensamblado dinámico.

access
AssemblyBuilderAccess

Modo de acceso del ensamblado dinámico.

Devoluciones

Un ensamblado dinámico con el nombre y modo de acceso especificados.

Implementaciones

Excepciones

name es null.

La propiedad Name de name es null.

o bien

La propiedad Name de name empieza con un espacio en blanco o contiene una barra diagonal o una barra diagonal inversa.

La operación se intenta en un dominio de aplicación descargado.

Ejemplos

En el ejemplo siguiente se muestra el método y AssemblyResolve el DefineDynamicAssembly evento .

Para que se ejecute este ejemplo de código, debe proporcionar el nombre completo del ensamblado. Para obtener información sobre cómo obtener el nombre completo del ensamblado, vea Nombres de ensamblado.

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

class DefinedDynamicAssemblySnippet {
   public static void Main() {
      AppDomain currentDomain = AppDomain.CurrentDomain;

      InstantiateMyDynamicType(currentDomain);   // Failed!

      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

      InstantiateMyDynamicType(currentDomain);   // OK!
   }

   static void InstantiateMyDynamicType(AppDomain domain) {
      try {
         // You must supply a valid fully qualified assembly name here.
         domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType");
      } catch (Exception e) {
         Console.WriteLine(e.Message);
      }
   }

   static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
      return DefineDynamicAssembly((AppDomain) sender);
   }

   static Assembly DefineDynamicAssembly(AppDomain domain) {
      // Build a dynamic assembly using Reflection Emit API.

      AssemblyName assemblyName = new AssemblyName();
      assemblyName.Name = "MyDynamicAssembly";

      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule");
      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public);
      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();

      ilGenerator.EmitWriteLine("MyDynamicType instantiated!");
      ilGenerator.Emit(OpCodes.Ret);

      typeBuilder.CreateType();

      return assemblyBuilder;
   }
}

Comentarios

Este método solo se debe usar para definir un ensamblado dinámico en el dominio de aplicación actual. Para obtener más información, consulte la sobrecarga del Load(AssemblyName) método.

Nota

Durante el desarrollo de código que emite ensamblados dinámicos, se recomienda usar una sobrecarga del DefineDynamicAssembly método que especifica evidencia y permisos, proporcionar la evidencia que desea que tenga el ensamblado dinámico e incluir SecurityPermissionFlag.SkipVerification en refusedPermissions. La inclusión SkipVerification en el refusedPermissions parámetro garantiza que se compruebe el MSIL. Una limitación de esta técnica es que también hace SecurityException que se produzca cuando se use con código que requiera plena confianza.

Se aplica a

.NET Framework 4.8.1 e outras versións
Produto Versións
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1