AppDomain.DefineDynamicAssembly Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Definisce un assembly dinamico nel dominio applicazione corrente.
Overload
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean, IEnumerable<CustomAttributeBuilder>) |
Obsoleti.
Definisce un assembly dinamico con il nome, la modalità di accesso, la directory di archiviazione, l'evidenza, le richieste di autorizzazione, l'opzione di sincronizzazione e gli attributi personalizzati specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean) |
Obsoleti.
Definisce un assembly dinamico usando il nome, la modalità di accesso, la directory di archiviazione, l'evidenza, le richieste di autorizzazione e l'opzione di sincronizzazione specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet) |
Obsoleti.
Definisce un assembly dinamico usando il nome, la modalità di accesso, la directory di archiviazione, l'evidenza e le richieste di autorizzazione specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, PermissionSet, PermissionSet, PermissionSet) |
Obsoleti.
Definisce un assembly dinamico usando il nome, la modalità di accesso, la directory di archiviazione e le richieste di autorizzazione specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence, PermissionSet, PermissionSet, PermissionSet) |
Obsoleti.
Definisce un assembly dinamico usando il nome, la modalità di accesso, l'evidenza e le richieste di autorizzazione specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Boolean, IEnumerable<CustomAttributeBuilder>) |
Definisce un assembly dinamico usando il nome, la modalità di accesso, la directory di archiviazione e l'opzione di sincronizzazione specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, PermissionSet, PermissionSet, PermissionSet) |
Obsoleti.
Definisce un assembly dinamico usando il nome, la modalità di accesso e le richieste di autorizzazione specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence) |
Obsoleti.
Definisce un assembly dinamico mediante il nome, la modalità di accesso, la directory di archiviazione e l'evidenza specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>, SecurityContextSource) |
Definisce un assembly dinamico con il nome, la modalità di accesso e gli attributi personalizzati specificati e usando il database di origine specificato per il contesto di sicurezza. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String) |
Definisce un assembly dinamico usando il nome, la modalità di accesso e la directory di archiviazione specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence) |
Obsoleti.
Definisce un assembly dinamico tramite il nome, la modalità di accesso e l'evidenza specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>) |
Definisce un assembly dinamico con il nome, la modalità di accesso e gli attributi personalizzati specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess) |
Definisce un assembly dinamico con nome e modalità di accesso specificati. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean, IEnumerable<CustomAttributeBuilder>)
Attenzione
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.
Definisce un assembly dinamico con il nome, la modalità di accesso, la directory di archiviazione, l'evidenza, le richieste di autorizzazione, l'opzione di sincronizzazione e gli attributi personalizzati specificati.
public:
System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::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);
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);
[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);
member this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet * bool * seq<System.Reflection.Emit.CustomAttributeBuilder> -> System.Reflection.Emit.AssemblyBuilder
[<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.")>]
member this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet * bool * seq<System.Reflection.Emit.CustomAttributeBuilder> -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, dir As String, evidence As Evidence, requiredPermissions As PermissionSet, optionalPermissions As PermissionSet, refusedPermissions As PermissionSet, isSynchronized As Boolean, assemblyAttributes As IEnumerable(Of CustomAttributeBuilder)) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità mediante cui si accederà all'assembly dinamico.
- dir
- String
Nome della directory nella quale verrà salvato l'assembly dinamico. Se dir
è null
, viene usata la directory corrente.
- evidence
- Evidence
Evidenza fornita per l'assembly dinamico. L'evidenza viene usata senza modifiche come il set di evidenza finale impiegato per la risoluzione dei criteri.
- requiredPermissions
- PermissionSet
Richiesta di autorizzazioni obbligatoria.
- optionalPermissions
- PermissionSet
Richiesta di autorizzazioni facoltativa.
- refusedPermissions
- PermissionSet
Richiesta di autorizzazioni rifiutata.
- isSynchronized
- Boolean
true
per sincronizzare la creazione di moduli, tipi e membri nell'assembly dinamico; in caso contrario, false
.
- assemblyAttributes
- IEnumerable<CustomAttributeBuilder>
Elenco enumerabile di attributi da applicare all'assembly oppure null
se non sono presenti attributi.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
- Attributi
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto oppure contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Commenti
Utilizzare questo overload del metodo per specificare gli attributi che non funzionano correttamente, a meno che non vengano applicati quando viene creato un assembly dinamico. Ad esempio, gli attributi di sicurezza come SecurityTransparentAttribute e SecurityCriticalAttribute non funzionano correttamente se vengono aggiunti dopo la creazione di un assembly dinamico.
Le richieste di autorizzazione specificate per i requiredPermissions
parametri , optionalPermissions
e refusedPermissions
vengono usate solo se viene fornito anche il evidence
parametro oppure se l'assembly dinamico viene salvato e ricaricato in memoria.
Nota
Quando si sviluppa codice che genera assembly dinamici, è consigliabile includere il SecurityPermissionFlag.SkipVerification flag nel refusedPermissions
parametro . L'inclusione di questo flag garantisce che venga verificato il linguaggio MSIL (Microsoft Intermediate Language). Questa tecnica rileverà la generazione involontaria di codice non verificabile, che altrimenti è molto difficile da rilevare. Una limitazione di questa tecnica è che viene SecurityException generata anche quando viene usata con il codice che richiede l'attendibilità totale.
Solo i chiamanti completamente attendibili possono fornire prove durante la definizione di un oggetto dinamico Assembly. Il runtime esegue il mapping Evidence tramite i criteri di sicurezza per determinare le autorizzazioni concesse. I chiamanti parzialmente attendibili devono fornire null
per il evidence
parametro . Se evidence
è null
, il runtime copia i set di autorizzazioni, ovvero i set di concessione e negazione correnti, dall'assembly del chiamante all'assembly dinamico definito e contrassegna i criteri come risolti.
Se l'assembly dinamico viene salvato su disco, i carichi successivi riceveranno concessioni in base ai criteri associati al percorso in cui è stato salvato l'assembly dinamico.
Se isSynchronized
è true
, i metodi seguenti dell'oggetto risultante AssemblyBuilder verranno sincronizzati: DefineDynamicModule, DefineResource, GetDynamicModuleAddResourceFile, , SetEntryPointe Save. Se due di questi metodi vengono chiamati su thread diversi, uno bloccherà fino al completamento dell'altro.
Questo overload del metodo viene introdotto in .NET Framework 3.5.
Vedi anche
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean)
Attenzione
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.
Definisce un assembly dinamico usando il nome, la modalità di accesso, la directory di archiviazione, l'evidenza, le richieste di autorizzazione e l'opzione di sincronizzazione specificati.
public:
virtual System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::String ^ dir, System::Security::Policy::Evidence ^ evidence, System::Security::PermissionSet ^ requiredPermissions, System::Security::PermissionSet ^ optionalPermissions, System::Security::PermissionSet ^ refusedPermissions, bool isSynchronized);
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.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);
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet * bool -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet * bool -> System.Reflection.Emit.AssemblyBuilder
[<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.")>]
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet * bool -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet * bool -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, dir As String, evidence As Evidence, requiredPermissions As PermissionSet, optionalPermissions As PermissionSet, refusedPermissions As PermissionSet, isSynchronized As Boolean) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità mediante cui si accederà all'assembly dinamico.
- dir
- String
Nome della directory nella quale verrà salvato l'assembly dinamico. Se dir
è null
, la directory predefinita sarà la directory corrente.
- evidence
- Evidence
Evidenza fornita per l'assembly dinamico. L'evidenza viene usata senza modifiche come il set di evidenza finale impiegato per la risoluzione dei criteri.
- requiredPermissions
- PermissionSet
Richiesta di autorizzazioni obbligatoria.
- optionalPermissions
- PermissionSet
Richiesta di autorizzazioni facoltativa.
- refusedPermissions
- PermissionSet
Richiesta di autorizzazioni rifiutata.
- isSynchronized
- Boolean
true
per sincronizzare la creazione di moduli, tipi e membri nell'assembly dinamico; in caso contrario, false
.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Implementazioni
- Attributi
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto o contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Esempio
Nell'esempio seguente viene illustrato il metodo e AssemblyResolve l'evento DefineDynamicAssembly .
Per eseguire questo esempio di codice, è necessario specificare il nome completo dell'assembly. Per informazioni su come ottenere il nome completo dell'assembly, vedere Nomi assembly.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
public:
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( dynamic_cast<AppDomain^>(sender) );
}
static Assembly^ DefineDynamicAssembly( AppDomain^ domain )
{
// Build a dynamic assembly using Reflection Emit API.
AssemblyName^ assemblyName = gcnew 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, nullptr );
ILGenerator^ ilGenerator = constructorBuilder->GetILGenerator();
ilGenerator->EmitWriteLine( "MyDynamicType instantiated!" );
ilGenerator->Emit( OpCodes::Ret );
typeBuilder->CreateType();
return assemblyBuilder;
}
};
int main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Test::InstantiateMyDynamicType( currentDomain ); // Failed!
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( Test::MyResolveEventHandler );
Test::InstantiateMyDynamicType( currentDomain ); // OK!
}
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;
}
}
open System
open System.Reflection
open System.Reflection.Emit
let instantiateMyDynamicType (domain: AppDomain) =
try
// You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
|> ignore
with e ->
printfn $"{e.Message}"
let defineDynamicAssembly (domain: AppDomain) =
// Build a dynamic assembly using Reflection Emit API.
let assemblyName = AssemblyName()
assemblyName.Name <- "MyDynamicAssembly"
let assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
let moduleBuilder = assemblyBuilder.DefineDynamicModule "MyDynamicModule"
let typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
let constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null)
let ilGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine "MyDynamicType instantiated!"
ilGenerator.Emit OpCodes.Ret
typeBuilder.CreateType() |> ignore
assemblyBuilder
let myResolveEventHandler (sender: obj) _ =
defineDynamicAssembly (sender :?> AppDomain)
:> Assembly
let currentDomain = AppDomain.CurrentDomain
instantiateMyDynamicType currentDomain // Failed!
currentDomain.add_AssemblyResolve(ResolveEventHandler myResolveEventHandler)
instantiateMyDynamicType currentDomain // OK!
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
InstantiateMyDynamicType(currentDomain) 'Failed!
AddHandler currentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
InstantiateMyDynamicType(currentDomain) 'OK!
End Sub
Sub InstantiateMyDynamicType(domain As AppDomain)
Try
' You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Return DefineDynamicAssembly(DirectCast(sender, AppDomain))
End Function 'MyResolveEventHandler
Function DefineDynamicAssembly(domain As AppDomain) As System.Reflection.Assembly
' Build a dynamic assembly using Reflection Emit API.
Dim assemblyName As New AssemblyName()
assemblyName.Name = "MyDynamicAssembly"
Dim assemblyBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule")
Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
Dim constructorBuilder As ConstructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Nothing)
Dim ilGenerator As ILGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine("MyDynamicType instantiated!")
ilGenerator.Emit(OpCodes.Ret)
typeBuilder.CreateType()
Return assemblyBuilder
End Function 'DefineDynamicAssembly
End Module 'Test
Commenti
Le richieste di autorizzazione specificate per requiredPermissions
, optionalPermissions
e refusedPermissions
vengono usate solo se evidence
viene fornito anche oppure se l'assembly dinamico viene salvato e ricaricato in memoria.
Nota
Durante lo sviluppo di codice che genera assembly dinamici, è consigliabile includere SecurityPermissionFlag.SkipVerification in refusedPermissions
. L'inclusione SkipVerification nel refusedPermissions
parametro garantisce che venga verificato il codice MSIL. Una limitazione di questa tecnica è che viene SecurityException generata anche quando viene usata con codice che richiede l'attendibilità totale.
Solo i chiamanti completamente attendibili possono fornire le proprie prove durante la definizione di un oggetto dinamico Assembly. Il runtime eseguirà Evidence il mapping di tramite i criteri di sicurezza per determinare le autorizzazioni concesse. I chiamanti parzialmente attendibili devono fornire null
per il evidence
parametro . Se evidence
è null
, il runtime copia i set di autorizzazioni, ovvero i set di concessione e negazione correnti, dal chiamante Assembly al dinamico Assembly definito e contrassegna i criteri come risolti.
Se il dinamico Assembly viene salvato su disco, i caricamenti successivi riceveranno concessioni in base ai criteri associati al percorso in cui è stato salvato .Assembly
Se isSynchronized
è true
, i metodi seguenti dell'oggetto risultante AssemblyBuilder verranno sincronizzati: DefineDynamicModule, DefineResource, GetDynamicModuleAddResourceFile, , SetEntryPointe Save. Se due di questi metodi vengono chiamati su thread diversi, uno bloccherà fino al completamento dell'altro.
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet)
Attenzione
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.
Definisce un assembly dinamico usando il nome, la modalità di accesso, la directory di archiviazione, l'evidenza e le richieste di autorizzazione specificati.
public:
virtual System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::String ^ dir, System::Security::Policy::Evidence ^ evidence, System::Security::PermissionSet ^ requiredPermissions, System::Security::PermissionSet ^ optionalPermissions, System::Security::PermissionSet ^ refusedPermissions);
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);
[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);
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
[<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.")>]
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, dir As String, evidence As Evidence, requiredPermissions As PermissionSet, optionalPermissions As PermissionSet, refusedPermissions As PermissionSet) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità mediante cui si accederà all'assembly dinamico.
- dir
- String
Nome della directory nella quale verrà salvato l'assembly. Se dir
è null
, la directory predefinita sarà la directory corrente.
- evidence
- Evidence
Evidenza fornita per l'assembly dinamico. L'evidenza viene usata senza modifiche come il set di evidenza finale impiegato per la risoluzione dei criteri.
- requiredPermissions
- PermissionSet
Richiesta di autorizzazioni obbligatoria.
- optionalPermissions
- PermissionSet
Richiesta di autorizzazioni facoltativa.
- refusedPermissions
- PermissionSet
Richiesta di autorizzazioni rifiutata.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Implementazioni
- Attributi
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto o contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Esempio
Nell'esempio seguente viene illustrato il metodo e AssemblyResolve l'evento DefineDynamicAssembly .
Per eseguire questo esempio di codice, è necessario specificare il nome completo dell'assembly. Per informazioni su come ottenere il nome completo dell'assembly, vedere Nomi assembly.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
public:
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( dynamic_cast<AppDomain^>(sender) );
}
static Assembly^ DefineDynamicAssembly( AppDomain^ domain )
{
// Build a dynamic assembly using Reflection Emit API.
AssemblyName^ assemblyName = gcnew 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, nullptr );
ILGenerator^ ilGenerator = constructorBuilder->GetILGenerator();
ilGenerator->EmitWriteLine( "MyDynamicType instantiated!" );
ilGenerator->Emit( OpCodes::Ret );
typeBuilder->CreateType();
return assemblyBuilder;
}
};
int main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Test::InstantiateMyDynamicType( currentDomain ); // Failed!
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( Test::MyResolveEventHandler );
Test::InstantiateMyDynamicType( currentDomain ); // OK!
}
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;
}
}
open System
open System.Reflection
open System.Reflection.Emit
let instantiateMyDynamicType (domain: AppDomain) =
try
// You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
|> ignore
with e ->
printfn $"{e.Message}"
let defineDynamicAssembly (domain: AppDomain) =
// Build a dynamic assembly using Reflection Emit API.
let assemblyName = AssemblyName()
assemblyName.Name <- "MyDynamicAssembly"
let assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
let moduleBuilder = assemblyBuilder.DefineDynamicModule "MyDynamicModule"
let typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
let constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null)
let ilGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine "MyDynamicType instantiated!"
ilGenerator.Emit OpCodes.Ret
typeBuilder.CreateType() |> ignore
assemblyBuilder
let myResolveEventHandler (sender: obj) _ =
defineDynamicAssembly (sender :?> AppDomain)
:> Assembly
let currentDomain = AppDomain.CurrentDomain
instantiateMyDynamicType currentDomain // Failed!
currentDomain.add_AssemblyResolve(ResolveEventHandler myResolveEventHandler)
instantiateMyDynamicType currentDomain // OK!
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
InstantiateMyDynamicType(currentDomain) 'Failed!
AddHandler currentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
InstantiateMyDynamicType(currentDomain) 'OK!
End Sub
Sub InstantiateMyDynamicType(domain As AppDomain)
Try
' You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Return DefineDynamicAssembly(DirectCast(sender, AppDomain))
End Function 'MyResolveEventHandler
Function DefineDynamicAssembly(domain As AppDomain) As System.Reflection.Assembly
' Build a dynamic assembly using Reflection Emit API.
Dim assemblyName As New AssemblyName()
assemblyName.Name = "MyDynamicAssembly"
Dim assemblyBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule")
Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
Dim constructorBuilder As ConstructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Nothing)
Dim ilGenerator As ILGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine("MyDynamicType instantiated!")
ilGenerator.Emit(OpCodes.Ret)
typeBuilder.CreateType()
Return assemblyBuilder
End Function 'DefineDynamicAssembly
End Module 'Test
Commenti
Le richieste di autorizzazione specificate per requiredPermissions
, optionalPermissions
e refusedPermissions
vengono usate solo se evidence
vengono fornite o se l'assembly dinamico viene salvato e ricaricato in memoria.
Nota
Durante lo sviluppo di codice che genera assembly dinamici, è consigliabile includere SecurityPermissionFlag.SkipVerification in refusedPermissions
. L'inclusione SkipVerification nel parametro garantisce che l'MSIL refusedPermissions
venga verificato. Una limitazione di questa tecnica è che causa SecurityException anche la generazione di quando viene usata con codice che richiede l'attendibilità completa.
Solo i chiamanti completamente attendibili possono fornire i propri evidence
quando si definisce un oggetto dinamico Assembly. Il runtime esegue il mapping tramite i Evidence criteri di sicurezza per determinare le autorizzazioni concesse. I chiamanti parzialmente attendibili devono fornire un valore Null evidence
. Se evidence
è null
, il runtime copia i set di autorizzazioni, ovvero la concessione corrente e i set di negazioni, dal chiamante Assembly al Assembly criterio dinamico definito e contrassegna i criteri come risolti.
Se il carico dinamico Assembly viene salvato su disco, i carichi successivi riceveranno le concessioni in base ai criteri associati alla posizione in cui è stato salvato.Assembly
Questo metodo deve essere usato solo per definire un assembly dinamico nel dominio applicazione corrente. Per altre informazioni, vedere l'overload del Load(AssemblyName) metodo.
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, PermissionSet, PermissionSet, PermissionSet)
Attenzione
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.
Definisce un assembly dinamico usando il nome, la modalità di accesso, la directory di archiviazione e le richieste di autorizzazione specificati.
public:
virtual System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::String ^ dir, System::Security::PermissionSet ^ requiredPermissions, System::Security::PermissionSet ^ optionalPermissions, System::Security::PermissionSet ^ refusedPermissions);
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);
[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);
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
[<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.")>]
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, dir As String, requiredPermissions As PermissionSet, optionalPermissions As PermissionSet, refusedPermissions As PermissionSet) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità mediante cui si accederà all'assembly dinamico.
- dir
- String
Nome della directory nella quale verrà salvato l'assembly. Se dir
è null
, la directory predefinita sarà la directory corrente.
- requiredPermissions
- PermissionSet
Richiesta di autorizzazioni obbligatoria.
- optionalPermissions
- PermissionSet
Richiesta di autorizzazioni facoltativa.
- refusedPermissions
- PermissionSet
Richiesta di autorizzazioni rifiutata.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Implementazioni
- Attributi
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto o contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Esempio
L'esempio seguente illustra il metodo e AssemblyResolve l'eventoDefineDynamicAssembly.
Per eseguire questo esempio di codice, è necessario specificare il nome dell'assembly completo. Per informazioni su come ottenere il nome dell'assembly completo, vedere Nomi di assembly.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
public:
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( dynamic_cast<AppDomain^>(sender) );
}
static Assembly^ DefineDynamicAssembly( AppDomain^ domain )
{
// Build a dynamic assembly using Reflection Emit API.
AssemblyName^ assemblyName = gcnew 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, nullptr );
ILGenerator^ ilGenerator = constructorBuilder->GetILGenerator();
ilGenerator->EmitWriteLine( "MyDynamicType instantiated!" );
ilGenerator->Emit( OpCodes::Ret );
typeBuilder->CreateType();
return assemblyBuilder;
}
};
int main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Test::InstantiateMyDynamicType( currentDomain ); // Failed!
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( Test::MyResolveEventHandler );
Test::InstantiateMyDynamicType( currentDomain ); // OK!
}
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;
}
}
open System
open System.Reflection
open System.Reflection.Emit
let instantiateMyDynamicType (domain: AppDomain) =
try
// You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
|> ignore
with e ->
printfn $"{e.Message}"
let defineDynamicAssembly (domain: AppDomain) =
// Build a dynamic assembly using Reflection Emit API.
let assemblyName = AssemblyName()
assemblyName.Name <- "MyDynamicAssembly"
let assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
let moduleBuilder = assemblyBuilder.DefineDynamicModule "MyDynamicModule"
let typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
let constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null)
let ilGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine "MyDynamicType instantiated!"
ilGenerator.Emit OpCodes.Ret
typeBuilder.CreateType() |> ignore
assemblyBuilder
let myResolveEventHandler (sender: obj) _ =
defineDynamicAssembly (sender :?> AppDomain)
:> Assembly
let currentDomain = AppDomain.CurrentDomain
instantiateMyDynamicType currentDomain // Failed!
currentDomain.add_AssemblyResolve(ResolveEventHandler myResolveEventHandler)
instantiateMyDynamicType currentDomain // OK!
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
InstantiateMyDynamicType(currentDomain) 'Failed!
AddHandler currentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
InstantiateMyDynamicType(currentDomain) 'OK!
End Sub
Sub InstantiateMyDynamicType(domain As AppDomain)
Try
' You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Return DefineDynamicAssembly(DirectCast(sender, AppDomain))
End Function 'MyResolveEventHandler
Function DefineDynamicAssembly(domain As AppDomain) As System.Reflection.Assembly
' Build a dynamic assembly using Reflection Emit API.
Dim assemblyName As New AssemblyName()
assemblyName.Name = "MyDynamicAssembly"
Dim assemblyBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule")
Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
Dim constructorBuilder As ConstructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Nothing)
Dim ilGenerator As ILGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine("MyDynamicType instantiated!")
ilGenerator.Emit(OpCodes.Ret)
typeBuilder.CreateType()
Return assemblyBuilder
End Function 'DefineDynamicAssembly
End Module 'Test
Commenti
Le richieste di autorizzazione specificate per requiredPermissions
, optionalPermissions
e refusedPermissions
non vengono usate a meno che l'assembly dinamico non sia stato salvato e ricaricato in memoria. Per specificare le richieste di autorizzazione per un assembly temporaneo che non viene mai salvato su disco, usare un overload del metodo che specifica l'evidenza DefineDynamicAssembly e le autorizzazioni richieste e fornire un Evidence oggetto.
Nota
Durante lo sviluppo di codice che genera assembly dinamici, è consigliabile usare un overload del DefineDynamicAssembly metodo che specifica l'evidenza e le autorizzazioni, fornire le prove che si desidera che l'assembly dinamico abbia e includere SecurityPermissionFlag.SkipVerification in refusedPermissions
. L'inclusione SkipVerification nel parametro garantisce che l'MSIL refusedPermissions
venga verificato. Una limitazione di questa tecnica è che causa SecurityException anche la generazione di quando viene usata con codice che richiede l'attendibilità completa.
Questo metodo deve essere usato solo per definire un assembly dinamico nel dominio applicazione corrente. Per altre informazioni, vedere l'overload del Load(AssemblyName) metodo.
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence, PermissionSet, PermissionSet, PermissionSet)
Attenzione
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.
Definisce un assembly dinamico usando il nome, la modalità di accesso, l'evidenza e le richieste di autorizzazione specificati.
public:
virtual 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);
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);
[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);
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
[<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.")>]
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.Policy.Evidence * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, evidence As Evidence, requiredPermissions As PermissionSet, optionalPermissions As PermissionSet, refusedPermissions As PermissionSet) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità mediante cui si accederà all'assembly dinamico.
- evidence
- Evidence
Evidenza fornita per l'assembly dinamico. L'evidenza viene usata senza modifiche come il set di evidenza finale impiegato per la risoluzione dei criteri.
- requiredPermissions
- PermissionSet
Richiesta di autorizzazioni obbligatoria.
- optionalPermissions
- PermissionSet
Richiesta di autorizzazioni facoltativa.
- refusedPermissions
- PermissionSet
Richiesta di autorizzazioni rifiutata.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Implementazioni
- Attributi
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto o contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Esempio
L'esempio seguente illustra il metodo e AssemblyResolve l'eventoDefineDynamicAssembly.
Per eseguire questo esempio di codice, è necessario specificare il nome dell'assembly completo. Per informazioni su come ottenere il nome dell'assembly completo, vedere Nomi di assembly.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
public:
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( dynamic_cast<AppDomain^>(sender) );
}
static Assembly^ DefineDynamicAssembly( AppDomain^ domain )
{
// Build a dynamic assembly using Reflection Emit API.
AssemblyName^ assemblyName = gcnew 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, nullptr );
ILGenerator^ ilGenerator = constructorBuilder->GetILGenerator();
ilGenerator->EmitWriteLine( "MyDynamicType instantiated!" );
ilGenerator->Emit( OpCodes::Ret );
typeBuilder->CreateType();
return assemblyBuilder;
}
};
int main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Test::InstantiateMyDynamicType( currentDomain ); // Failed!
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( Test::MyResolveEventHandler );
Test::InstantiateMyDynamicType( currentDomain ); // OK!
}
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;
}
}
open System
open System.Reflection
open System.Reflection.Emit
let instantiateMyDynamicType (domain: AppDomain) =
try
// You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
|> ignore
with e ->
printfn $"{e.Message}"
let defineDynamicAssembly (domain: AppDomain) =
// Build a dynamic assembly using Reflection Emit API.
let assemblyName = AssemblyName()
assemblyName.Name <- "MyDynamicAssembly"
let assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
let moduleBuilder = assemblyBuilder.DefineDynamicModule "MyDynamicModule"
let typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
let constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null)
let ilGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine "MyDynamicType instantiated!"
ilGenerator.Emit OpCodes.Ret
typeBuilder.CreateType() |> ignore
assemblyBuilder
let myResolveEventHandler (sender: obj) _ =
defineDynamicAssembly (sender :?> AppDomain)
:> Assembly
let currentDomain = AppDomain.CurrentDomain
instantiateMyDynamicType currentDomain // Failed!
currentDomain.add_AssemblyResolve(ResolveEventHandler myResolveEventHandler)
instantiateMyDynamicType currentDomain // OK!
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
InstantiateMyDynamicType(currentDomain) 'Failed!
AddHandler currentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
InstantiateMyDynamicType(currentDomain) 'OK!
End Sub
Sub InstantiateMyDynamicType(domain As AppDomain)
Try
' You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Return DefineDynamicAssembly(DirectCast(sender, AppDomain))
End Function 'MyResolveEventHandler
Function DefineDynamicAssembly(domain As AppDomain) As System.Reflection.Assembly
' Build a dynamic assembly using Reflection Emit API.
Dim assemblyName As New AssemblyName()
assemblyName.Name = "MyDynamicAssembly"
Dim assemblyBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule")
Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
Dim constructorBuilder As ConstructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Nothing)
Dim ilGenerator As ILGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine("MyDynamicType instantiated!")
ilGenerator.Emit(OpCodes.Ret)
typeBuilder.CreateType()
Return assemblyBuilder
End Function 'DefineDynamicAssembly
End Module 'Test
Commenti
Le richieste di autorizzazione specificate per requiredPermissions
, optionalPermissions
e refusedPermissions
vengono usate solo se evidence
vengono fornite o se l'assembly dinamico viene salvato e ricaricato in memoria.
Nota
Durante lo sviluppo di codice che genera assembly dinamici, è consigliabile includere SecurityPermissionFlag.SkipVerification in refusedPermissions
. L'inclusione SkipVerification nel parametro garantisce che l'MSIL refusedPermissions
venga verificato. Una limitazione di questa tecnica è che causa SecurityException anche la generazione di quando viene usata con codice che richiede l'attendibilità completa.
Solo i chiamanti completamente attendibili possono fornire i propri evidence
quando si definisce un oggetto dinamico Assembly. Il runtime esegue il mapping tramite i Evidence criteri di sicurezza per determinare le autorizzazioni concesse. I chiamanti parzialmente attendibili devono fornire un valore Null evidence
. Se evidence
è null
, il runtime copia i set di autorizzazioni, ovvero la concessione corrente e i set di negazioni, dal chiamante Assembly al Assembly criterio dinamico definito e contrassegna i criteri come risolti.
Se il carico dinamico Assembly viene salvato su disco, i carichi successivi riceveranno le concessioni in base ai criteri associati alla posizione in cui è stato salvato.Assembly
Questo metodo deve essere usato solo per definire un assembly dinamico nel dominio applicazione corrente. Per altre informazioni, vedere l'overload del Load(AssemblyName) metodo.
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Boolean, IEnumerable<CustomAttributeBuilder>)
Definisce un assembly dinamico usando il nome, la modalità di accesso, la directory di archiviazione e l'opzione di sincronizzazione specificati.
public:
System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::String ^ dir, bool isSynchronized, System::Collections::Generic::IEnumerable<System::Reflection::Emit::CustomAttributeBuilder ^> ^ assemblyAttributes);
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);
member this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * bool * seq<System.Reflection.Emit.CustomAttributeBuilder> -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, dir As String, isSynchronized As Boolean, assemblyAttributes As IEnumerable(Of CustomAttributeBuilder)) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità mediante cui si accederà all'assembly dinamico.
- dir
- String
Nome della directory nella quale verrà salvato l'assembly dinamico. Se dir
è null
, viene usata la directory corrente.
- isSynchronized
- Boolean
true
per sincronizzare la creazione di moduli, tipi e membri nell'assembly dinamico; in caso contrario, false
.
- assemblyAttributes
- IEnumerable<CustomAttributeBuilder>
Elenco enumerabile di attributi da applicare all'assembly oppure null
se non sono presenti attributi.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto oppure contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Commenti
Usare questo overload di metodo per specificare gli attributi che non funzionano correttamente a meno che non vengano applicati quando viene creato un assembly dinamico. Ad esempio, gli attributi di sicurezza come SecurityTransparentAttribute e SecurityCriticalAttribute non funzionano correttamente se vengono aggiunti dopo la creazione di un assembly dinamico.
Se isSynchronized
è true
, i metodi seguenti dell'oggetto risultante AssemblyBuilder verranno sincronizzati: DefineDynamicModule, AddResourceFileSetEntryPointDefineResourceGetDynamicModule, e .Save Se due di questi metodi vengono chiamati su thread diversi, uno bloccherà fino al completamento dell'altro.
Vedi anche
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, PermissionSet, PermissionSet, PermissionSet)
Attenzione
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.
Definisce un assembly dinamico usando il nome, la modalità di accesso e le richieste di autorizzazione specificati.
public:
virtual 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);
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);
[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);
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
[<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.")>]
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.PermissionSet * System.Security.PermissionSet * System.Security.PermissionSet -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, requiredPermissions As PermissionSet, optionalPermissions As PermissionSet, refusedPermissions As PermissionSet) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità mediante cui si accederà all'assembly dinamico.
- requiredPermissions
- PermissionSet
Richiesta di autorizzazioni obbligatoria.
- optionalPermissions
- PermissionSet
Richiesta di autorizzazioni facoltativa.
- refusedPermissions
- PermissionSet
Richiesta di autorizzazioni rifiutata.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Implementazioni
- Attributi
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto o contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Esempio
L'esempio seguente illustra il metodo e AssemblyResolve l'eventoDefineDynamicAssembly.
Per eseguire questo esempio di codice, è necessario specificare il nome completo dell'assembly. Per informazioni su come ottenere il nome completo dell'assembly, vedere Nomi assembly.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
public:
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( dynamic_cast<AppDomain^>(sender) );
}
static Assembly^ DefineDynamicAssembly( AppDomain^ domain )
{
// Build a dynamic assembly using Reflection Emit API.
AssemblyName^ assemblyName = gcnew 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, nullptr );
ILGenerator^ ilGenerator = constructorBuilder->GetILGenerator();
ilGenerator->EmitWriteLine( "MyDynamicType instantiated!" );
ilGenerator->Emit( OpCodes::Ret );
typeBuilder->CreateType();
return assemblyBuilder;
}
};
int main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Test::InstantiateMyDynamicType( currentDomain ); // Failed!
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( Test::MyResolveEventHandler );
Test::InstantiateMyDynamicType( currentDomain ); // OK!
}
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;
}
}
open System
open System.Reflection
open System.Reflection.Emit
let instantiateMyDynamicType (domain: AppDomain) =
try
// You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
|> ignore
with e ->
printfn $"{e.Message}"
let defineDynamicAssembly (domain: AppDomain) =
// Build a dynamic assembly using Reflection Emit API.
let assemblyName = AssemblyName()
assemblyName.Name <- "MyDynamicAssembly"
let assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
let moduleBuilder = assemblyBuilder.DefineDynamicModule "MyDynamicModule"
let typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
let constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null)
let ilGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine "MyDynamicType instantiated!"
ilGenerator.Emit OpCodes.Ret
typeBuilder.CreateType() |> ignore
assemblyBuilder
let myResolveEventHandler (sender: obj) _ =
defineDynamicAssembly (sender :?> AppDomain)
:> Assembly
let currentDomain = AppDomain.CurrentDomain
instantiateMyDynamicType currentDomain // Failed!
currentDomain.add_AssemblyResolve(ResolveEventHandler myResolveEventHandler)
instantiateMyDynamicType currentDomain // OK!
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
InstantiateMyDynamicType(currentDomain) 'Failed!
AddHandler currentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
InstantiateMyDynamicType(currentDomain) 'OK!
End Sub
Sub InstantiateMyDynamicType(domain As AppDomain)
Try
' You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Return DefineDynamicAssembly(DirectCast(sender, AppDomain))
End Function 'MyResolveEventHandler
Function DefineDynamicAssembly(domain As AppDomain) As System.Reflection.Assembly
' Build a dynamic assembly using Reflection Emit API.
Dim assemblyName As New AssemblyName()
assemblyName.Name = "MyDynamicAssembly"
Dim assemblyBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule")
Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
Dim constructorBuilder As ConstructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Nothing)
Dim ilGenerator As ILGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine("MyDynamicType instantiated!")
ilGenerator.Emit(OpCodes.Ret)
typeBuilder.CreateType()
Return assemblyBuilder
End Function 'DefineDynamicAssembly
End Module 'Test
Commenti
Le richieste di autorizzazione specificate per requiredPermissions
, optionalPermissions
e refusedPermissions
non vengono usate a meno che l'assembly dinamico non sia stato salvato e ricaricato in memoria. Per specificare le richieste di autorizzazione per un assembly temporaneo che non viene mai salvato su disco, usare un overload del DefineDynamicAssembly metodo che specifica l'evidenza, nonché le autorizzazioni richieste e fornire un Evidence oggetto.
Nota
Durante lo sviluppo di codice che genera assembly dinamici, è consigliabile usare un overload del DefineDynamicAssembly metodo che specifica l'evidenza e le autorizzazioni, fornire l'evidenza che si vuole che l'assembly dinamico abbia e includere SecurityPermissionFlag.SkipVerification in refusedPermissions
. L'inclusione SkipVerification nel refusedPermissions
parametro garantisce che venga verificato il codice MSIL. Una limitazione di questa tecnica è che viene SecurityException generata anche quando viene usata con codice che richiede l'attendibilità totale.
Questo metodo deve essere usato solo per definire un assembly dinamico nel dominio applicazione corrente. Per altre informazioni, vedere l'overload del Load(AssemblyName) metodo .
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence)
Attenzione
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.
Definisce un assembly dinamico mediante il nome, la modalità di accesso, la directory di archiviazione e l'evidenza specificati.
public:
virtual System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::String ^ dir, System::Security::Policy::Evidence ^ evidence);
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir, System.Security.Policy.Evidence evidence);
[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);
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence -> System.Reflection.Emit.AssemblyBuilder
[<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.")>]
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, dir As String, evidence As Evidence) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità mediante cui si accederà all'assembly dinamico.
- dir
- String
Nome della directory nella quale verrà salvato l'assembly. Se dir
è null
, la directory predefinita sarà la directory corrente.
- evidence
- Evidence
Evidenza fornita per l'assembly dinamico. L'evidenza viene usata senza modifiche come il set di evidenza finale impiegato per la risoluzione dei criteri.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Implementazioni
- Attributi
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto o contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Esempio
Nell'esempio seguente viene illustrato il metodo e AssemblyResolve l'evento DefineDynamicAssembly .
Per eseguire questo esempio di codice, è necessario specificare il nome completo dell'assembly. Per informazioni su come ottenere il nome completo dell'assembly, vedere Nomi assembly.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
public:
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( dynamic_cast<AppDomain^>(sender) );
}
static Assembly^ DefineDynamicAssembly( AppDomain^ domain )
{
// Build a dynamic assembly using Reflection Emit API.
AssemblyName^ assemblyName = gcnew 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, nullptr );
ILGenerator^ ilGenerator = constructorBuilder->GetILGenerator();
ilGenerator->EmitWriteLine( "MyDynamicType instantiated!" );
ilGenerator->Emit( OpCodes::Ret );
typeBuilder->CreateType();
return assemblyBuilder;
}
};
int main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Test::InstantiateMyDynamicType( currentDomain ); // Failed!
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( Test::MyResolveEventHandler );
Test::InstantiateMyDynamicType( currentDomain ); // OK!
}
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;
}
}
open System
open System.Reflection
open System.Reflection.Emit
let instantiateMyDynamicType (domain: AppDomain) =
try
// You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
|> ignore
with e ->
printfn $"{e.Message}"
let defineDynamicAssembly (domain: AppDomain) =
// Build a dynamic assembly using Reflection Emit API.
let assemblyName = AssemblyName()
assemblyName.Name <- "MyDynamicAssembly"
let assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
let moduleBuilder = assemblyBuilder.DefineDynamicModule "MyDynamicModule"
let typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
let constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null)
let ilGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine "MyDynamicType instantiated!"
ilGenerator.Emit OpCodes.Ret
typeBuilder.CreateType() |> ignore
assemblyBuilder
let myResolveEventHandler (sender: obj) _ =
defineDynamicAssembly (sender :?> AppDomain)
:> Assembly
let currentDomain = AppDomain.CurrentDomain
instantiateMyDynamicType currentDomain // Failed!
currentDomain.add_AssemblyResolve(ResolveEventHandler myResolveEventHandler)
instantiateMyDynamicType currentDomain // OK!
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
InstantiateMyDynamicType(currentDomain) 'Failed!
AddHandler currentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
InstantiateMyDynamicType(currentDomain) 'OK!
End Sub
Sub InstantiateMyDynamicType(domain As AppDomain)
Try
' You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Return DefineDynamicAssembly(DirectCast(sender, AppDomain))
End Function 'MyResolveEventHandler
Function DefineDynamicAssembly(domain As AppDomain) As System.Reflection.Assembly
' Build a dynamic assembly using Reflection Emit API.
Dim assemblyName As New AssemblyName()
assemblyName.Name = "MyDynamicAssembly"
Dim assemblyBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule")
Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
Dim constructorBuilder As ConstructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Nothing)
Dim ilGenerator As ILGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine("MyDynamicType instantiated!")
ilGenerator.Emit(OpCodes.Ret)
typeBuilder.CreateType()
Return assemblyBuilder
End Function 'DefineDynamicAssembly
End Module 'Test
Commenti
Solo i chiamanti completamente attendibili possono fornire i relativi evidence
dati durante la definizione di un oggetto dinamico Assembly. Il runtime eseguirà Evidence il mapping di tramite i criteri di sicurezza per determinare le autorizzazioni concesse. I chiamanti parzialmente attendibili devono fornire un valore Null evidence
. Se evidence
è null
, il runtime copia i set di autorizzazioni, ovvero i set di concessione e negazione correnti, dal chiamante Assembly al dinamico Assembly definito e contrassegna i criteri come risolti.
Se il dinamico Assembly viene salvato su disco, i caricamenti successivi riceveranno concessioni in base ai criteri associati al percorso in cui è stato salvato .Assembly
Questo metodo deve essere usato solo per definire un assembly dinamico nel dominio applicazione corrente. Per altre informazioni, vedere l'overload del Load(AssemblyName) metodo.
Nota
Durante lo sviluppo di codice che genera assembly dinamici, è consigliabile usare un overload del DefineDynamicAssembly metodo che specifica l'evidenza e le autorizzazioni, fornire l'evidenza che si vuole che l'assembly dinamico abbia e includere SecurityPermissionFlag.SkipVerification in refusedPermissions
. L'inclusione SkipVerification nel refusedPermissions
parametro garantisce che venga verificato il codice MSIL. Una limitazione di questa tecnica è che viene SecurityException generata anche quando viene usata con codice che richiede l'attendibilità totale.
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>, SecurityContextSource)
Definisce un assembly dinamico con il nome, la modalità di accesso e gli attributi personalizzati specificati e usando il database di origine specificato per il contesto di sicurezza.
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);
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);
member this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * seq<System.Reflection.Emit.CustomAttributeBuilder> * System.Security.SecurityContextSource -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, assemblyAttributes As IEnumerable(Of CustomAttributeBuilder), securityContextSource As SecurityContextSource) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità di accesso per l'assembly dinamico.
- assemblyAttributes
- IEnumerable<CustomAttributeBuilder>
Elenco enumerabile di attributi da applicare all'assembly oppure null
se non sono presenti attributi.
- securityContextSource
- SecurityContextSource
Origine del contesto di sicurezza.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto oppure contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Il valore di securityContextSource
non è uno dei valori di enumerazione.
Commenti
Utilizzare questo overload del metodo per specificare gli attributi che non funzionano correttamente, a meno che non vengano applicati quando viene creato un assembly dinamico. Ad esempio, gli attributi di sicurezza come SecurityTransparentAttribute e SecurityCriticalAttribute non funzionano correttamente se vengono aggiunti dopo la creazione di un assembly dinamico.
Questo metodo deve essere usato solo per definire un assembly dinamico nel dominio applicazione corrente. Per altre informazioni su questa restrizione, vedere l'overload del Load(AssemblyName) metodo.
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String)
Definisce un assembly dinamico usando il nome, la modalità di accesso e la directory di archiviazione specificati.
public:
virtual System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::String ^ dir);
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, string dir);
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, dir As String) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità mediante cui si accederà all'assembly dinamico.
- dir
- String
Nome della directory nella quale verrà salvato l'assembly. Se dir
è null
, la directory predefinita sarà la directory corrente.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Implementazioni
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto o contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Esempio
Nell'esempio seguente viene illustrato il metodo e AssemblyResolve l'evento DefineDynamicAssembly .
Per eseguire questo esempio di codice, è necessario specificare il nome completo dell'assembly. Per informazioni su come ottenere il nome completo dell'assembly, vedere Nomi assembly.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
public:
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( dynamic_cast<AppDomain^>(sender) );
}
static Assembly^ DefineDynamicAssembly( AppDomain^ domain )
{
// Build a dynamic assembly using Reflection Emit API.
AssemblyName^ assemblyName = gcnew 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, nullptr );
ILGenerator^ ilGenerator = constructorBuilder->GetILGenerator();
ilGenerator->EmitWriteLine( "MyDynamicType instantiated!" );
ilGenerator->Emit( OpCodes::Ret );
typeBuilder->CreateType();
return assemblyBuilder;
}
};
int main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Test::InstantiateMyDynamicType( currentDomain ); // Failed!
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( Test::MyResolveEventHandler );
Test::InstantiateMyDynamicType( currentDomain ); // OK!
}
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;
}
}
open System
open System.Reflection
open System.Reflection.Emit
let instantiateMyDynamicType (domain: AppDomain) =
try
// You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
|> ignore
with e ->
printfn $"{e.Message}"
let defineDynamicAssembly (domain: AppDomain) =
// Build a dynamic assembly using Reflection Emit API.
let assemblyName = AssemblyName()
assemblyName.Name <- "MyDynamicAssembly"
let assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
let moduleBuilder = assemblyBuilder.DefineDynamicModule "MyDynamicModule"
let typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
let constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null)
let ilGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine "MyDynamicType instantiated!"
ilGenerator.Emit OpCodes.Ret
typeBuilder.CreateType() |> ignore
assemblyBuilder
let myResolveEventHandler (sender: obj) _ =
defineDynamicAssembly (sender :?> AppDomain)
:> Assembly
let currentDomain = AppDomain.CurrentDomain
instantiateMyDynamicType currentDomain // Failed!
currentDomain.add_AssemblyResolve(ResolveEventHandler myResolveEventHandler)
instantiateMyDynamicType currentDomain // OK!
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
InstantiateMyDynamicType(currentDomain) 'Failed!
AddHandler currentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
InstantiateMyDynamicType(currentDomain) 'OK!
End Sub
Sub InstantiateMyDynamicType(domain As AppDomain)
Try
' You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Return DefineDynamicAssembly(DirectCast(sender, AppDomain))
End Function 'MyResolveEventHandler
Function DefineDynamicAssembly(domain As AppDomain) As System.Reflection.Assembly
' Build a dynamic assembly using Reflection Emit API.
Dim assemblyName As New AssemblyName()
assemblyName.Name = "MyDynamicAssembly"
Dim assemblyBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule")
Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
Dim constructorBuilder As ConstructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Nothing)
Dim ilGenerator As ILGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine("MyDynamicType instantiated!")
ilGenerator.Emit(OpCodes.Ret)
typeBuilder.CreateType()
Return assemblyBuilder
End Function 'DefineDynamicAssembly
End Module 'Test
Commenti
Questo metodo deve essere usato solo per definire un assembly dinamico nel dominio applicazione corrente. Per altre informazioni, vedere l'overload del Load(AssemblyName) metodo.
Nota
Durante lo sviluppo di codice che genera assembly dinamici, è consigliabile usare un overload del DefineDynamicAssembly metodo che specifica l'evidenza e le autorizzazioni, fornire l'evidenza che si vuole che l'assembly dinamico abbia e includere SecurityPermissionFlag.SkipVerification in refusedPermissions
. L'inclusione SkipVerification nel refusedPermissions
parametro garantisce che venga verificato il codice MSIL. Una limitazione di questa tecnica è che viene SecurityException generata anche quando viene usata con codice che richiede l'attendibilità totale.
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence)
Attenzione
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.
Definisce un assembly dinamico tramite il nome, la modalità di accesso e l'evidenza specificati.
public:
virtual System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::Security::Policy::Evidence ^ evidence);
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, System.Security.Policy.Evidence evidence);
[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);
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.Policy.Evidence -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.Policy.Evidence -> System.Reflection.Emit.AssemblyBuilder
[<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.")>]
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.Policy.Evidence -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.Policy.Evidence -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, evidence As Evidence) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità mediante cui si accederà all'assembly dinamico.
- evidence
- Evidence
Evidenza fornita per l'assembly dinamico. L'evidenza viene usata senza modifiche come il set di evidenza finale impiegato per la risoluzione dei criteri.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Implementazioni
- Attributi
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto o contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Esempio
Nell'esempio seguente viene illustrato il DefineDynamicAssembly metodo e l'evento AssemblyResolve .
In primo luogo, l'esempio di codice tenta di creare un'istanza di MyDynamicType
chiamando il CreateInstance metodo con un nome di assembly non valido e rileva l'eccezione risultante.
Nell'esempio di codice viene quindi aggiunto un gestore eventi per l'evento AssemblyResolve e si tenta nuovamente di creare un'istanza diMyDynamicType
. Durante la chiamata a CreateInstance, viene generato l'evento AssemblyResolve per l'assembly non valido. Il gestore eventi crea un assembly dinamico che contiene un tipo denominato MyDynamicType
, assegna al tipo un costruttore senza parametri e restituisce il nuovo assembly dinamico. La chiamata a CreateInstance termina correttamente e il costruttore per MyDynamicType
visualizza un messaggio nella console.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
public:
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( dynamic_cast<AppDomain^>(sender) );
}
static Assembly^ DefineDynamicAssembly( AppDomain^ domain )
{
// Build a dynamic assembly using Reflection Emit API.
AssemblyName^ assemblyName = gcnew 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, nullptr );
ILGenerator^ ilGenerator = constructorBuilder->GetILGenerator();
ilGenerator->EmitWriteLine( "MyDynamicType instantiated!" );
ilGenerator->Emit( OpCodes::Ret );
typeBuilder->CreateType();
return assemblyBuilder;
}
};
int main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Test::InstantiateMyDynamicType( currentDomain ); // Failed!
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( Test::MyResolveEventHandler );
Test::InstantiateMyDynamicType( currentDomain ); // OK!
}
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;
}
}
open System
open System.Reflection
open System.Reflection.Emit
let instantiateMyDynamicType (domain: AppDomain) =
try
// You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
|> ignore
with e ->
printfn $"{e.Message}"
let defineDynamicAssembly (domain: AppDomain) =
// Build a dynamic assembly using Reflection Emit API.
let assemblyName = AssemblyName()
assemblyName.Name <- "MyDynamicAssembly"
let assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
let moduleBuilder = assemblyBuilder.DefineDynamicModule "MyDynamicModule"
let typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
let constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null)
let ilGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine "MyDynamicType instantiated!"
ilGenerator.Emit OpCodes.Ret
typeBuilder.CreateType() |> ignore
assemblyBuilder
let myResolveEventHandler (sender: obj) _ =
defineDynamicAssembly (sender :?> AppDomain)
:> Assembly
let currentDomain = AppDomain.CurrentDomain
instantiateMyDynamicType currentDomain // Failed!
currentDomain.add_AssemblyResolve(ResolveEventHandler myResolveEventHandler)
instantiateMyDynamicType currentDomain // OK!
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
InstantiateMyDynamicType(currentDomain) 'Failed!
AddHandler currentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
InstantiateMyDynamicType(currentDomain) 'OK!
End Sub
Sub InstantiateMyDynamicType(domain As AppDomain)
Try
' You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Return DefineDynamicAssembly(DirectCast(sender, AppDomain))
End Function 'MyResolveEventHandler
Function DefineDynamicAssembly(domain As AppDomain) As System.Reflection.Assembly
' Build a dynamic assembly using Reflection Emit API.
Dim assemblyName As New AssemblyName()
assemblyName.Name = "MyDynamicAssembly"
Dim assemblyBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule")
Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
Dim constructorBuilder As ConstructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Nothing)
Dim ilGenerator As ILGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine("MyDynamicType instantiated!")
ilGenerator.Emit(OpCodes.Ret)
typeBuilder.CreateType()
Return assemblyBuilder
End Function 'DefineDynamicAssembly
End Module 'Test
Commenti
Solo i chiamanti completamente attendibili possono fornire i propri evidence
quando si definisce un oggetto dinamico Assembly. Il runtime esegue il mapping tramite i Evidence criteri di sicurezza per determinare le autorizzazioni concesse. I chiamanti parzialmente attendibili devono fornire un valore Null evidence
. Se evidence
è null
, il runtime copia i set di autorizzazioni, ovvero la concessione corrente e i set di negazioni, dal chiamante Assembly al Assembly criterio dinamico definito e contrassegna i criteri come risolti.
Se il carico dinamico Assembly viene salvato su disco, i carichi successivi riceveranno le concessioni in base ai criteri associati alla posizione in cui è stato salvato.Assembly
Questo metodo deve essere usato solo per definire un assembly dinamico nel dominio applicazione corrente. Per altre informazioni, vedere l'overload del Load(AssemblyName) metodo.
Nota
Durante lo sviluppo di codice che genera assembly dinamici, è consigliabile usare un overload del DefineDynamicAssembly metodo che specifica l'evidenza e le autorizzazioni, fornire le prove che si desidera che l'assembly dinamico abbia e includere SecurityPermissionFlag.SkipVerification in refusedPermissions
. L'inclusione SkipVerification nel parametro garantisce che l'MSIL refusedPermissions
venga verificato. Una limitazione di questa tecnica è che causa SecurityException anche la generazione di quando viene usata con codice che richiede l'attendibilità completa.
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>)
Definisce un assembly dinamico con il nome, la modalità di accesso e gli attributi personalizzati specificati.
public:
System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::Collections::Generic::IEnumerable<System::Reflection::Emit::CustomAttributeBuilder ^> ^ assemblyAttributes);
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access, System.Collections.Generic.IEnumerable<System.Reflection.Emit.CustomAttributeBuilder> assemblyAttributes);
member this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * seq<System.Reflection.Emit.CustomAttributeBuilder> -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess, assemblyAttributes As IEnumerable(Of CustomAttributeBuilder)) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità di accesso per l'assembly dinamico.
- assemblyAttributes
- IEnumerable<CustomAttributeBuilder>
Elenco enumerabile di attributi da applicare all'assembly oppure null
se non sono presenti attributi.
Restituisce
Assembly dinamico con nome e funzionalità specificati.
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto oppure contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Esempio
Nell'esempio SecurityTransparentAttributedi codice seguente viene illustrato come creare un assembly dinamico con . L'attributo deve essere specificato come elemento di una matrice di CustomAttributeBuilder oggetti.
Il primo passaggio della creazione CustomAttributeBuilder consiste nel ottenere un costruttore per l'attributo. Il costruttore non ha parametri, quindi il GetConstructor metodo viene chiamato con una matrice vuota di Type oggetti per rappresentare i tipi dei parametri. Il secondo passaggio consiste nel passare l'oggetto risultante ConstructorInfo al costruttore per la CustomAttributeBuilder classe, insieme a una matrice vuota di tipo Object per rappresentare gli argomenti.
Il risultato CustomAttributeBuilder viene quindi passato al DefineDynamicAssembly metodo come unico elemento di una matrice.
Il codice di esempio definisce un modulo e un tipo nel nuovo assembly dinamico e quindi visualizza gli attributi dell'assembly.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Security;
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 =
SecurityTransparentAttribute::typeid->GetConstructor(
Type::EmptyTypes);
CustomAttributeBuilder^ transparent = gcnew CustomAttributeBuilder(
transparentCtor,
gcnew array<Object^> {} );
// Create a dynamic assembly using the attribute. The attribute is
// passed as an array with one element.
AssemblyName^ aName = gcnew AssemblyName("EmittedAssembly");
AssemblyBuilder^ ab = AppDomain::CurrentDomain->DefineDynamicAssembly(
aName,
AssemblyBuilderAccess::Run,
gcnew array<CustomAttributeBuilder^> { transparent } );
ModuleBuilder^ mb = ab->DefineDynamicModule( aName->Name );
TypeBuilder^ tb = mb->DefineType(
"MyDynamicType",
TypeAttributes::Public );
tb->CreateType();
Console::WriteLine("{0}\nAssembly attributes:", ab);
for each (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
*/
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
*/
open System
open System.Reflection
open System.Reflection.Emit
open System.Security
// 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.
//
let transparentCtor =
typeof<SecurityTransparentAttribute>.GetConstructor(Type.EmptyTypes)
let transparent = CustomAttributeBuilder(transparentCtor, [||])
// Create a dynamic assembly using the attribute. The attribute is
// passed as an array with one element.
let aName = AssemblyName "EmittedAssembly"
let ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
aName,
AssemblyBuilderAccess.Run,
[| transparent |])
let mb = ab.DefineDynamicModule aName.Name
let tb = mb.DefineType(
"MyDynamicType",
TypeAttributes.Public )
tb.CreateType() |> ignore
printfn $"{ab}\nAssembly attributes:"
for attr in ab.GetCustomAttributes true do
printfn $"\t{attr}"
(* This code example produces the following output:
EmittedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Assembly attributes:
System.Security.SecurityTransparentAttribute
*)
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Security
Module Example
Sub 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.
'
Dim transparentCtor As ConstructorInfo = _
GetType(SecurityTransparentAttribute).GetConstructor( _
Type.EmptyTypes)
Dim transparent As New CustomAttributeBuilder( _
transparentCtor, _
New Object() {} )
' Create a dynamic assembly Imports the attribute. The attribute is
' passed as an array with one element.
Dim aName As New AssemblyName("EmittedAssembly")
Dim ab As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly( _
aName, _
AssemblyBuilderAccess.Run, _
New CustomAttributeBuilder() { transparent } )
Dim mb As ModuleBuilder = ab.DefineDynamicModule( aName.Name )
Dim tb As TypeBuilder = mb.DefineType( _
"MyDynamicType", _
TypeAttributes.Public )
tb.CreateType()
Console.WriteLine("{0}" & vbLf & "Assembly attributes:", ab)
For Each attr As Attribute In ab.GetCustomAttributes(True)
Console.WriteLine(vbTab & "{0}", attr)
Next
End Sub
End Module
' This code example produces the following output:
'
'EmittedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
'Assembly attributes:
' System.Security.SecurityTransparentAttribute
Commenti
Usare questo overload di metodo per specificare gli attributi che non funzionano correttamente a meno che non vengano applicati quando viene creato un assembly dinamico. Ad esempio, gli attributi di sicurezza come SecurityTransparentAttribute e SecurityCriticalAttribute non funzionano correttamente se vengono aggiunti dopo la creazione di un assembly dinamico.
Questo metodo deve essere usato solo per definire un assembly dinamico nel dominio applicazione corrente. Per altre informazioni su questa restrizione, vedere l'overload del Load(AssemblyName) metodo.
Questo overload di metodo viene introdotto in .NET Framework 3.5.
Vedi anche
Si applica a
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess)
Definisce un assembly dinamico con nome e modalità di accesso specificati.
public:
virtual System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access);
public System.Reflection.Emit.AssemblyBuilder DefineDynamicAssembly (System.Reflection.AssemblyName name, System.Reflection.Emit.AssemblyBuilderAccess access);
abstract member DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess -> System.Reflection.Emit.AssemblyBuilder
override this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess) As AssemblyBuilder
Parametri
- name
- AssemblyName
Identità univoca dell'assembly dinamico.
- access
- AssemblyBuilderAccess
Modalità di accesso per l'assembly dinamico.
Restituisce
Assembly dinamico con il nome e la modalità di accesso specificati.
Implementazioni
Eccezioni
name
è null
.
La proprietà Name
di name
è null
.
-oppure-
La proprietà Name
di name
inizia con uno spazio vuoto o contiene una barra o una barra rovesciata.
L'operazione viene tentata in un dominio dell'applicazione non caricato.
Esempio
L'esempio seguente illustra il metodo e AssemblyResolve l'eventoDefineDynamicAssembly.
Per eseguire questo esempio di codice, è necessario specificare il nome dell'assembly completo. Per informazioni su come ottenere il nome dell'assembly completo, vedere Nomi di assembly.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
public:
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( dynamic_cast<AppDomain^>(sender) );
}
static Assembly^ DefineDynamicAssembly( AppDomain^ domain )
{
// Build a dynamic assembly using Reflection Emit API.
AssemblyName^ assemblyName = gcnew 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, nullptr );
ILGenerator^ ilGenerator = constructorBuilder->GetILGenerator();
ilGenerator->EmitWriteLine( "MyDynamicType instantiated!" );
ilGenerator->Emit( OpCodes::Ret );
typeBuilder->CreateType();
return assemblyBuilder;
}
};
int main()
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Test::InstantiateMyDynamicType( currentDomain ); // Failed!
currentDomain->AssemblyResolve += gcnew ResolveEventHandler( Test::MyResolveEventHandler );
Test::InstantiateMyDynamicType( currentDomain ); // OK!
}
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;
}
}
open System
open System.Reflection
open System.Reflection.Emit
let instantiateMyDynamicType (domain: AppDomain) =
try
// You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
|> ignore
with e ->
printfn $"{e.Message}"
let defineDynamicAssembly (domain: AppDomain) =
// Build a dynamic assembly using Reflection Emit API.
let assemblyName = AssemblyName()
assemblyName.Name <- "MyDynamicAssembly"
let assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
let moduleBuilder = assemblyBuilder.DefineDynamicModule "MyDynamicModule"
let typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
let constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null)
let ilGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine "MyDynamicType instantiated!"
ilGenerator.Emit OpCodes.Ret
typeBuilder.CreateType() |> ignore
assemblyBuilder
let myResolveEventHandler (sender: obj) _ =
defineDynamicAssembly (sender :?> AppDomain)
:> Assembly
let currentDomain = AppDomain.CurrentDomain
instantiateMyDynamicType currentDomain // Failed!
currentDomain.add_AssemblyResolve(ResolveEventHandler myResolveEventHandler)
instantiateMyDynamicType currentDomain // OK!
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
InstantiateMyDynamicType(currentDomain) 'Failed!
AddHandler currentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
InstantiateMyDynamicType(currentDomain) 'OK!
End Sub
Sub InstantiateMyDynamicType(domain As AppDomain)
Try
' You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Return DefineDynamicAssembly(DirectCast(sender, AppDomain))
End Function 'MyResolveEventHandler
Function DefineDynamicAssembly(domain As AppDomain) As System.Reflection.Assembly
' Build a dynamic assembly using Reflection Emit API.
Dim assemblyName As New AssemblyName()
assemblyName.Name = "MyDynamicAssembly"
Dim assemblyBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule")
Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
Dim constructorBuilder As ConstructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Nothing)
Dim ilGenerator As ILGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine("MyDynamicType instantiated!")
ilGenerator.Emit(OpCodes.Ret)
typeBuilder.CreateType()
Return assemblyBuilder
End Function 'DefineDynamicAssembly
End Module 'Test
Commenti
Questo metodo deve essere usato solo per definire un assembly dinamico nel dominio applicazione corrente. Per altre informazioni, vedere l'overload del Load(AssemblyName) metodo.
Nota
Durante lo sviluppo di codice che genera assembly dinamici, è consigliabile usare un overload del DefineDynamicAssembly metodo che specifica l'evidenza e le autorizzazioni, fornire le prove che si desidera che l'assembly dinamico abbia e includere SecurityPermissionFlag.SkipVerification in refusedPermissions
. L'inclusione SkipVerification nel parametro garantisce che l'MSIL refusedPermissions
venga verificato. Una limitazione di questa tecnica è che causa SecurityException anche la generazione di quando viene usata con codice che richiede l'attendibilità completa.