AppDomain.DefineDynamicAssembly Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Definiuje zestaw dynamiczny w bieżącej domenie aplikacji.
Przeciążenia
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean, IEnumerable<CustomAttributeBuilder>) |
Przestarzałe.
Definiuje zestaw dynamiczny o określonej nazwie, trybie dostępu, katalogu magazynu, dowodach, żądaniach uprawnień, opcji synchronizacji i atrybutach niestandardowych. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean) |
Przestarzałe.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, katalogu magazynu, dowodów, żądań uprawnień i opcji synchronizacji. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet) |
Przestarzałe.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, katalogu magazynu, dowodów i żądań uprawnień. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, PermissionSet, PermissionSet, PermissionSet) |
Przestarzałe.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, katalogu magazynu i żądań uprawnień. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence, PermissionSet, PermissionSet, PermissionSet) |
Przestarzałe.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, dowodów i żądań uprawnień. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Boolean, IEnumerable<CustomAttributeBuilder>) |
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, katalogu magazynu i opcji synchronizacji. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, PermissionSet, PermissionSet, PermissionSet) |
Przestarzałe.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu i żądań uprawnień. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence) |
Przestarzałe.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, katalogu magazynu i dowodów. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>, SecurityContextSource) |
Definiuje zestaw dynamiczny o określonej nazwie, trybie dostępu i atrybutach niestandardowych oraz przy użyciu określonego źródła dla kontekstu zabezpieczeń. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String) |
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu i katalogu magazynu. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence) |
Przestarzałe.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu i dowodów. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>) |
Definiuje zestaw dynamiczny o określonej nazwie, trybie dostępu i atrybutach niestandardowych. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess) |
Definiuje zestaw dynamiczny z określoną nazwą i trybem dostępu. |
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean, IEnumerable<CustomAttributeBuilder>)
Przestroga
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.
Definiuje zestaw dynamiczny o określonej nazwie, trybie dostępu, katalogu magazynu, dowodach, żądaniach uprawnień, opcji synchronizacji i atrybutach niestandardowych.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb, w którym będzie dostępny zestaw dynamiczny.
- dir
- String
Nazwa katalogu, w którym zostanie zapisany zestaw dynamiczny. Jeśli dir
parametr ma null
wartość , używany jest bieżący katalog.
- evidence
- Evidence
Dowód dostarczony dla zestawu dynamicznego. Dowód w niezmienionej formie jest używany jako ostateczny zestaw stosowanych zasad rozpoznawania dowodów.
- requiredPermissions
- PermissionSet
Żądanie wymaganych uprawnień.
- optionalPermissions
- PermissionSet
Opcjonalne żądanie uprawnienia.
- refusedPermissions
- PermissionSet
Żądanie odrzuconych uprawnień.
- isSynchronized
- Boolean
true
aby zsynchronizować tworzenie modułów, typów i elementów członkowskich w zestawie dynamicznym; w przeciwnym razie , false
.
- assemblyAttributes
- IEnumerable<CustomAttributeBuilder>
Wyliczana lista atrybutów, które mają być stosowane do zestawu, lub null
jeśli nie ma atrybutów.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
- Atrybuty
Wyjątki
name
to null
.
Właściwość Name
właściwości name
to null
.
-lub-
Właściwość Name
zaczyna się od białej name
spacji lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Uwagi
Ta metoda przeciążenia służy do określania atrybutów, które nie będą działać poprawnie, chyba że są one stosowane podczas tworzenia zestawu dynamicznego. Na przykład atrybuty zabezpieczeń, takie jak SecurityTransparentAttribute i SecurityCriticalAttribute nie działają prawidłowo, jeśli są dodawane po utworzeniu zestawu dynamicznego.
Żądania uprawnień określone dla parametrów requiredPermissions
, optionalPermissions
i refusedPermissions
są używane tylko wtedy, gdy evidence
parametr jest również dostarczany, lub jeśli zestaw dynamiczny jest zapisywany i ładowany ponownie do pamięci.
Uwaga
Podczas opracowywania kodu, który emituje zestawy dynamiczne, zalecamy uwzględnienie SecurityPermissionFlag.SkipVerification flagi w parametrze refusedPermissions
. Włączenie tej flagi gwarantuje, że język pośredni microsoft (MSIL) zostanie zweryfikowany. Ta technika wykryje niezamierzone generowanie nieweryfikowalnego kodu, co w przeciwnym razie jest bardzo trudne do wykrycia. Ograniczenie tej techniki polega również na tym, że jest SecurityException on zgłaszany, gdy jest używany z kodem wymagającym pełnego zaufania.
Tylko w pełni zaufane osoby wywołujące mogą dostarczyć dowody podczas definiowania dynamicznego Assemblyelementu . Środowisko uruchomieniowe mapuje Evidence zasady zabezpieczeń za pomocą zasad zabezpieczeń, aby określić przyznane uprawnienia. Częściowo zaufane wywołujące muszą podać null
parametr evidence
. Jeśli evidence
jest null
to , środowisko uruchomieniowe kopiuje zestawy uprawnień (czyli bieżące zestawy udzielania i odmowy) z zestawu wywołującego do zestawu dynamicznego, który jest definiowany, i oznacza zasady jako rozwiązane.
Jeśli zestaw dynamiczny zostanie zapisany na dysku, kolejne obciążenia otrzymają dotacje na podstawie zasad skojarzonych z lokalizacją, w której został zapisany zestaw dynamiczny.
Jeśli isSynchronized
parametr ma true
wartość , następujące metody wynikowe AssemblyBuilder zostaną zsynchronizowane: DefineDynamicModule, , DefineResource, AddResourceFileGetDynamicModule, SetEntryPoint, i Save. Jeśli dwie z tych metod są wywoływane w różnych wątkach, jeden zostanie zablokowany do momentu zakończenia drugiego.
To przeciążenie metody jest wprowadzane w .NET Framework 3.5.
Zobacz też
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean)
Przestroga
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.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, katalogu magazynu, dowodów, żądań uprawnień i opcji synchronizacji.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb, w którym będzie dostępny zestaw dynamiczny.
- dir
- String
Nazwa katalogu, w którym zostanie zapisany zestaw dynamiczny. Jeśli dir
parametr ma null
wartość , katalog jest domyślny dla bieżącego katalogu.
- evidence
- Evidence
Dowód dostarczony dla zestawu dynamicznego. Dowód w niezmienionej formie jest używany jako ostateczny zestaw stosowanych zasad rozpoznawania dowodów.
- requiredPermissions
- PermissionSet
Żądanie wymaganych uprawnień.
- optionalPermissions
- PermissionSet
Opcjonalne żądanie uprawnienia.
- refusedPermissions
- PermissionSet
Żądanie odrzuconych uprawnień.
- isSynchronized
- Boolean
true
aby zsynchronizować tworzenie modułów, typów i elementów członkowskich w zestawie dynamicznym; w przeciwnym razie , false
.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Implementuje
- Atrybuty
Wyjątki
name
to null
.
Właściwość Name
właściwości name
to null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Przykłady
Poniższy przykład przedstawia metodę DefineDynamicAssembly i AssemblyResolve zdarzenie.
Aby ten przykładowy kod zadziałał, należy podać w pełni kwalifikowaną nazwę zestawu. Aby uzyskać informacje na temat uzyskiwania w pełni kwalifikowanej nazwy zestawu, zobacz Nazwy zestawów.
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
Uwagi
Żądania uprawnień określone dla requiredPermissions
, optionalPermissions
i refusedPermissions
są używane tylko wtedy, gdy evidence
jest dostarczany, lub jeśli zestaw dynamiczny jest zapisywany i ładowany ponownie do pamięci.
Uwaga
Podczas opracowywania kodu, który emituje zestawy dynamiczne, zaleca się uwzględnienie SecurityPermissionFlag.SkipVerification w pliku refusedPermissions
. Uwzględnienie SkipVerification parametru refusedPermissions
gwarantuje, że MSIL zostanie zweryfikowany. Ograniczenie tej techniki polega również na tym, że jest SecurityException on zgłaszany w przypadku użycia z kodem wymagającym pełnego zaufania.
Tylko w pełni zaufani wywołujący mogą dostarczyć swoje dowody podczas definiowania dynamicznego Assemblyelementu . Środowisko uruchomieniowe zamapuje Evidence zasady zabezpieczeń za pomocą zasad zabezpieczeń, aby określić przyznane uprawnienia. Częściowo zaufane wywołujące muszą podać null
parametr evidence
. Jeśli evidence
jest null
to , środowisko uruchomieniowe kopiuje zestawy uprawnień, czyli bieżące zestawy udzielania i odmowy, od obiektu wywołującego Assembly do zdefiniowanej dynamicznej Assembly i oznacza zasady jako rozwiązane.
Jeśli dynamiczny Assembly zostanie zapisany na dysku, kolejne obciążenia otrzymają dotacje na podstawie zasad skojarzonych z lokalizacją, w Assembly której zapisano.
Jeśli isSynchronized
parametr ma true
wartość , następujące metody wynikowe AssemblyBuilder zostaną zsynchronizowane: DefineDynamicModule, , DefineResource, AddResourceFileGetDynamicModule, SetEntryPoint, i Save. Jeśli dwie z tych metod są wywoływane w różnych wątkach, jeden zostanie zablokowany do momentu zakończenia drugiego.
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet)
Przestroga
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.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, katalogu magazynu, dowodów i żądań uprawnień.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb, w którym będzie dostępny zestaw dynamiczny.
- dir
- String
Nazwa katalogu, w którym zostanie zapisany zestaw. Jeśli dir
jest to null
, katalog jest domyślny dla bieżącego katalogu.
- evidence
- Evidence
Dowód dostarczony dla zestawu dynamicznego. Dowód w niezmienionej formie jest używany jako ostateczny zestaw stosowanych zasad rozpoznawania dowodów.
- requiredPermissions
- PermissionSet
Żądanie wymaganych uprawnień.
- optionalPermissions
- PermissionSet
Opcjonalne żądanie uprawnienia.
- refusedPermissions
- PermissionSet
Żądanie odrzuconych uprawnień.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Implementuje
- Atrybuty
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Przykłady
Poniższy przykład przedstawia metodę DefineDynamicAssembly i AssemblyResolve zdarzenie.
Aby ten przykładowy kod zadziałał, należy podać w pełni kwalifikowaną nazwę zestawu. Aby uzyskać informacje na temat uzyskiwania w pełni kwalifikowanej nazwy zestawu, zobacz Nazwy zestawów.
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
Uwagi
Żądania uprawnień określone dla requiredPermissions
, optionalPermissions
i refusedPermissions
są używane tylko wtedy, gdy evidence
jest również dostarczany, lub jeśli zestaw dynamiczny jest zapisywany i ponownie ładowany do pamięci.
Uwaga
Podczas opracowywania kodu, który emituje zestawy dynamiczne, zaleca się uwzględnienie SecurityPermissionFlag.SkipVerification w refusedPermissions
pliku . Uwzględnienie SkipVerification parametru refusedPermissions
gwarantuje, że MSIL zostanie zweryfikowany. Ograniczenie tej techniki polega również na tym, że jest SecurityException on również zgłaszany w przypadku użycia z kodem, który wymaga pełnego zaufania.
Tylko w pełni zaufane osoby wywołujące mogą podać je evidence
podczas definiowania dynamicznego Assemblyelementu . Środowisko uruchomieniowe zamapuje Evidence zasady zabezpieczeń, aby określić przyznane uprawnienia. Częściowo zaufane osoby wywołujące muszą podać wartość null evidence
. Jeśli evidence
jest to null
, środowisko uruchomieniowe kopiuje zestawy uprawnień, czyli bieżące zestawy udzielania i odmowy, z obiektu wywołującego Assembly do zdefiniowanej dynamicznej Assembly i oznacza zasady zgodnie z rozwiązaniem.
Jeśli dynamiczny Assembly zostanie zapisany na dysku, kolejne obciążenia otrzymają dotacje na podstawie zasad skojarzonych z lokalizacją, w której Assembly zapisano.
Ta metoda powinna służyć wyłącznie do definiowania zestawu dynamicznego w bieżącej domenie aplikacji. Aby uzyskać więcej informacji, zobacz przeciążenie Load(AssemblyName) metody.
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, PermissionSet, PermissionSet, PermissionSet)
Przestroga
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.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, katalogu magazynu i żądań uprawnień.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb, w którym będzie dostępny zestaw dynamiczny.
- dir
- String
Nazwa katalogu, w którym zostanie zapisany zestaw. Jeśli dir
jest to null
, katalog jest domyślny dla bieżącego katalogu.
- requiredPermissions
- PermissionSet
Żądanie wymaganych uprawnień.
- optionalPermissions
- PermissionSet
Opcjonalne żądanie uprawnienia.
- refusedPermissions
- PermissionSet
Żądanie odrzuconych uprawnień.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Implementuje
- Atrybuty
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Przykłady
Poniższy przykład przedstawia metodę DefineDynamicAssembly i AssemblyResolve zdarzenie.
Aby ten przykładowy kod zadziałał, należy podać w pełni kwalifikowaną nazwę zestawu. Aby uzyskać informacje o sposobie uzyskania w pełni kwalifikowanej nazwy zestawu, zobacz Nazwy zestawów.
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
Uwagi
Żądania uprawnień określone dla requiredPermissions
, optionalPermissions
i refusedPermissions
nie są używane, chyba że zestaw dynamiczny został zapisany i ponownie załadowany do pamięci. Aby określić żądania uprawnień dla przejściowego zestawu, który nigdy nie jest zapisywany na dysku, użyj przeciążenia DefineDynamicAssembly metody, która określa dowody, a także żądane uprawnienia i podaj Evidence obiekt.
Uwaga
Podczas opracowywania kodu, który emituje zestawy dynamiczne, zaleca się użycie przeciążenia DefineDynamicAssembly metody, która określa dowody i uprawnienia, podać dowody, które mają zawierać zestaw dynamiczny i uwzględnić SecurityPermissionFlag.SkipVerification w refusedPermissions
pliku . Uwzględnienie SkipVerification parametru refusedPermissions
gwarantuje, że MSIL zostanie zweryfikowany. Ograniczenie tej techniki polega również na tym, że jest SecurityException on również zgłaszany w przypadku użycia z kodem, który wymaga pełnego zaufania.
Ta metoda powinna służyć wyłącznie do definiowania zestawu dynamicznego w bieżącej domenie aplikacji. Aby uzyskać więcej informacji, zobacz przeciążenie Load(AssemblyName) metody.
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence, PermissionSet, PermissionSet, PermissionSet)
Przestroga
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.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, dowodów i żądań uprawnień.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb, w którym będzie dostępny zestaw dynamiczny.
- evidence
- Evidence
Dowód dostarczony dla zestawu dynamicznego. Dowód w niezmienionej formie jest używany jako ostateczny zestaw stosowanych zasad rozpoznawania dowodów.
- requiredPermissions
- PermissionSet
Żądanie wymaganych uprawnień.
- optionalPermissions
- PermissionSet
Opcjonalne żądanie uprawnienia.
- refusedPermissions
- PermissionSet
Żądanie odrzuconych uprawnień.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Implementuje
- Atrybuty
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Przykłady
Poniższy przykład przedstawia metodę DefineDynamicAssembly i AssemblyResolve zdarzenie.
Aby ten przykładowy kod zadziałał, należy podać w pełni kwalifikowaną nazwę zestawu. Aby uzyskać informacje o sposobie uzyskania w pełni kwalifikowanej nazwy zestawu, zobacz Nazwy zestawów.
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
Uwagi
Żądania uprawnień określone dla requiredPermissions
, optionalPermissions
i refusedPermissions
są używane tylko wtedy, gdy evidence
jest również dostarczany, lub jeśli zestaw dynamiczny jest zapisywany i ponownie ładowany do pamięci.
Uwaga
Podczas opracowywania kodu, który emituje zestawy dynamiczne, zaleca się uwzględnienie SecurityPermissionFlag.SkipVerification w refusedPermissions
pliku . Uwzględnienie SkipVerification parametru refusedPermissions
gwarantuje, że MSIL zostanie zweryfikowany. Ograniczenie tej techniki polega również na tym, że jest SecurityException on również zgłaszany w przypadku użycia z kodem, który wymaga pełnego zaufania.
Tylko w pełni zaufane osoby wywołujące mogą podać je evidence
podczas definiowania dynamicznego Assemblyelementu . Środowisko uruchomieniowe zamapuje Evidence zasady zabezpieczeń, aby określić przyznane uprawnienia. Częściowo zaufane osoby wywołujące muszą podać wartość null evidence
. Jeśli evidence
jest to null
, środowisko uruchomieniowe kopiuje zestawy uprawnień, czyli bieżące zestawy udzielania i odmowy, z obiektu wywołującego Assembly do zdefiniowanej dynamicznej Assembly i oznacza zasady zgodnie z rozwiązaniem.
Jeśli dynamiczny Assembly zostanie zapisany na dysku, kolejne obciążenia otrzymają dotacje na podstawie zasad skojarzonych z lokalizacją, w której Assembly zapisano.
Ta metoda powinna służyć wyłącznie do definiowania zestawu dynamicznego w bieżącej domenie aplikacji. Aby uzyskać więcej informacji, zobacz przeciążenie Load(AssemblyName) metody.
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Boolean, IEnumerable<CustomAttributeBuilder>)
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, katalogu magazynu i opcji synchronizacji.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb, w którym będzie dostępny zestaw dynamiczny.
- dir
- String
Nazwa katalogu, w którym zostanie zapisany zestaw dynamiczny. Jeśli dir
jest to null
, używany jest bieżący katalog.
- isSynchronized
- Boolean
true
synchronizowanie tworzenia modułów, typów i elementów członkowskich w zestawie dynamicznym; w przeciwnym razie , false
.
- assemblyAttributes
- IEnumerable<CustomAttributeBuilder>
Wyliczalna lista atrybutów, które mają być stosowane do zestawu, lub null
jeśli nie ma atrybutów.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Uwagi
Ta metoda przeciążenia służy do określania atrybutów, które nie będą działać poprawnie, chyba że są one stosowane podczas tworzenia zestawu dynamicznego. Na przykład atrybuty zabezpieczeń, takie jak SecurityTransparentAttribute i SecurityCriticalAttribute nie działają poprawnie, jeśli są dodawane po utworzeniu zestawu dynamicznego.
Jeśli isSynchronized
jest to true
, następujące metody wynikowej AssemblyBuilder zostaną zsynchronizowane: DefineDynamicModule, , AddResourceFileDefineResource, GetDynamicModule, SetEntryPoint, i Save. Jeśli dwie z tych metod są wywoływane w różnych wątkach, jeden zostanie zablokowany do momentu zakończenia drugiego.
Zobacz też
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, PermissionSet, PermissionSet, PermissionSet)
Przestroga
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.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu i żądań uprawnień.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb, w którym będzie dostępny zestaw dynamiczny.
- requiredPermissions
- PermissionSet
Żądanie wymaganych uprawnień.
- optionalPermissions
- PermissionSet
Opcjonalne żądanie uprawnienia.
- refusedPermissions
- PermissionSet
Żądanie odrzuconych uprawnień.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Implementuje
- Atrybuty
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Przykłady
Poniższy przykład przedstawia metodę DefineDynamicAssembly i AssemblyResolve zdarzenie.
Aby ten przykładowy kod zadziałał, należy podać w pełni kwalifikowaną nazwę zestawu. Aby uzyskać informacje o sposobie uzyskania w pełni kwalifikowanej nazwy zestawu, zobacz Nazwy zestawów.
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
Uwagi
Żądania uprawnień określone dla requiredPermissions
, optionalPermissions
i refusedPermissions
nie są używane, chyba że zestaw dynamiczny został zapisany i ponownie załadowany do pamięci. Aby określić żądania uprawnień dla przejściowego zestawu, który nigdy nie jest zapisywany na dysku, użyj przeciążenia DefineDynamicAssembly metody, która określa dowody, a także żądane uprawnienia i podaj Evidence obiekt.
Uwaga
Podczas opracowywania kodu, który emituje zestawy dynamiczne, zaleca się użycie przeciążenia DefineDynamicAssembly metody, która określa dowody i uprawnienia, podać dowody, które mają zawierać zestaw dynamiczny i uwzględnić SecurityPermissionFlag.SkipVerification w refusedPermissions
pliku . Uwzględnienie SkipVerification parametru refusedPermissions
gwarantuje, że MSIL zostanie zweryfikowany. Ograniczenie tej techniki polega również na tym, że jest SecurityException on również zgłaszany w przypadku użycia z kodem, który wymaga pełnego zaufania.
Ta metoda powinna służyć wyłącznie do definiowania zestawu dynamicznego w bieżącej domenie aplikacji. Aby uzyskać więcej informacji, zobacz przeciążenie Load(AssemblyName) metody .
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence)
Przestroga
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.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu, katalogu magazynu i dowodów.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb, w którym będzie dostępny zestaw dynamiczny.
- dir
- String
Nazwa katalogu, w którym zostanie zapisany zestaw. Jeśli dir
jest to null
, katalog jest domyślny dla bieżącego katalogu.
- evidence
- Evidence
Dowód dostarczony dla zestawu dynamicznego. Dowód w niezmienionej formie jest używany jako ostateczny zestaw stosowanych zasad rozpoznawania dowodów.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Implementuje
- Atrybuty
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Przykłady
Poniższy przykład przedstawia metodę DefineDynamicAssembly i AssemblyResolve zdarzenie.
Aby ten przykładowy kod zadziałał, należy podać w pełni kwalifikowaną nazwę zestawu. Aby uzyskać informacje o sposobie uzyskania w pełni kwalifikowanej nazwy zestawu, zobacz Nazwy zestawów.
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
Uwagi
Tylko w pełni zaufane osoby wywołujące mogą podać je evidence
podczas definiowania dynamicznego Assemblyelementu . Środowisko uruchomieniowe zamapuje Evidence zasady zabezpieczeń, aby określić przyznane uprawnienia. Częściowo zaufane osoby wywołujące muszą podać wartość null evidence
. Jeśli evidence
jest to null
, środowisko uruchomieniowe kopiuje zestawy uprawnień, czyli bieżące zestawy udzielania i odmowy, z obiektu wywołującego Assembly do zdefiniowanej dynamicznej Assembly i oznacza zasady zgodnie z rozwiązaniem.
Jeśli dynamiczny Assembly zostanie zapisany na dysku, kolejne obciążenia otrzymają dotacje na podstawie zasad skojarzonych z lokalizacją, w której Assembly zapisano.
Ta metoda powinna służyć wyłącznie do definiowania zestawu dynamicznego w bieżącej domenie aplikacji. Aby uzyskać więcej informacji, zobacz przeciążenie Load(AssemblyName) metody.
Uwaga
Podczas opracowywania kodu, który emituje zestawy dynamiczne, zaleca się użycie przeciążenia DefineDynamicAssembly metody, która określa dowody i uprawnienia, podać dowody, które mają zawierać zestaw dynamiczny i uwzględnić SecurityPermissionFlag.SkipVerification w refusedPermissions
pliku . Uwzględnienie SkipVerification parametru refusedPermissions
gwarantuje, że MSIL zostanie zweryfikowany. Ograniczenie tej techniki polega również na tym, że jest SecurityException on również zgłaszany w przypadku użycia z kodem, który wymaga pełnego zaufania.
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>, SecurityContextSource)
Definiuje zestaw dynamiczny o określonej nazwie, trybie dostępu i atrybutach niestandardowych oraz przy użyciu określonego źródła dla kontekstu zabezpieczeń.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb dostępu dla zestawu dynamicznego.
- assemblyAttributes
- IEnumerable<CustomAttributeBuilder>
Wyliczalna lista atrybutów, które mają być stosowane do zestawu, lub null
jeśli nie ma atrybutów.
- securityContextSource
- SecurityContextSource
Źródło kontekstu zabezpieczeń.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Wartość nie securityContextSource
była jedną z wartości wyliczenia.
Uwagi
Ta metoda przeciążenia służy do określania atrybutów, które nie będą działać poprawnie, chyba że są one stosowane podczas tworzenia zestawu dynamicznego. Na przykład atrybuty zabezpieczeń, takie jak SecurityTransparentAttribute i SecurityCriticalAttribute nie działają poprawnie, jeśli są dodawane po utworzeniu zestawu dynamicznego.
Ta metoda powinna służyć tylko do definiowania zestawu dynamicznego w bieżącej domenie aplikacji. Aby uzyskać więcej informacji na temat tego ograniczenia, zobacz Load(AssemblyName) przeciążenie metody.
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String)
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu i katalogu magazynu.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb, w którym będzie dostępny zestaw dynamiczny.
- dir
- String
Nazwa katalogu, w którym zostanie zapisany zestaw. Jeśli dir
jest to null
, katalog jest domyślny dla bieżącego katalogu.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Implementuje
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Przykłady
Poniższy przykład przedstawia metodę DefineDynamicAssembly i AssemblyResolve zdarzenie.
Aby ten przykładowy kod zadziałał, należy podać w pełni kwalifikowaną nazwę zestawu. Aby uzyskać informacje o sposobie uzyskania w pełni kwalifikowanej nazwy zestawu, zobacz Nazwy zestawów.
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
Uwagi
Ta metoda powinna służyć wyłącznie do definiowania zestawu dynamicznego w bieżącej domenie aplikacji. Aby uzyskać więcej informacji, zobacz przeciążenie Load(AssemblyName) metody.
Uwaga
Podczas opracowywania kodu, który emituje zestawy dynamiczne, zaleca się użycie przeciążenia DefineDynamicAssembly metody, która określa dowody i uprawnienia, podać dowody, które mają zawierać zestaw dynamiczny i uwzględnić SecurityPermissionFlag.SkipVerification w refusedPermissions
pliku . Uwzględnienie SkipVerification parametru refusedPermissions
gwarantuje, że MSIL zostanie zweryfikowany. Ograniczenie tej techniki polega również na tym, że jest SecurityException on również zgłaszany w przypadku użycia z kodem, który wymaga pełnego zaufania.
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence)
Przestroga
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.
Definiuje zestaw dynamiczny przy użyciu określonej nazwy, trybu dostępu i dowodów.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb, w którym będzie dostępny zestaw dynamiczny.
- evidence
- Evidence
Dowód dostarczony dla zestawu dynamicznego. Dowód w niezmienionej formie jest używany jako ostateczny zestaw stosowanych zasad rozpoznawania dowodów.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Implementuje
- Atrybuty
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Przykłady
Poniższy przykład przedstawia metodę DefineDynamicAssembly i AssemblyResolve zdarzenie.
Najpierw przykład kodu próbuje utworzyć wystąpienie MyDynamicType
klasy , wywołując CreateInstance metodę z nieprawidłową nazwą zestawu i przechwytując wynikowy wyjątek.
Przykład kodu dodaje następnie procedurę obsługi zdarzeń AssemblyResolve dla zdarzenia, a następnie ponownie próbuje utworzyć wystąpienieMyDynamicType
. Podczas wywołania metody CreateInstanceAssemblyResolve zdarzenie jest wywoływane dla nieprawidłowego zestawu. Procedura obsługi zdarzeń tworzy zestaw dynamiczny zawierający typ o nazwie MyDynamicType
, daje typ konstruktora bez parametrów i zwraca nowy zestaw dynamiczny. Wywołanie polecenia zakończy CreateInstance się pomyślnie, a konstruktor dla MyDynamicType
polecenia wyświetli komunikat w konsoli programu .
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
Uwagi
Tylko w pełni zaufane osoby wywołujące mogą podać je evidence
podczas definiowania dynamicznego Assemblyelementu . Środowisko uruchomieniowe zamapuje Evidence zasady zabezpieczeń, aby określić przyznane uprawnienia. Częściowo zaufane osoby wywołujące muszą podać wartość null evidence
. Jeśli evidence
jest to null
, środowisko uruchomieniowe kopiuje zestawy uprawnień, czyli bieżące zestawy udzielania i odmowy, z obiektu wywołującego Assembly do zdefiniowanej dynamicznej Assembly i oznacza zasady zgodnie z rozwiązaniem.
Jeśli dynamiczny Assembly zostanie zapisany na dysku, kolejne obciążenia otrzymają dotacje na podstawie zasad skojarzonych z lokalizacją, w której Assembly zapisano.
Ta metoda powinna służyć wyłącznie do definiowania zestawu dynamicznego w bieżącej domenie aplikacji. Aby uzyskać więcej informacji, zobacz przeciążenie Load(AssemblyName) metody.
Uwaga
Podczas opracowywania kodu, który emituje zestawy dynamiczne, zaleca się użycie przeciążenia DefineDynamicAssembly metody, która określa dowody i uprawnienia, podać dowody, które mają zawierać zestaw dynamiczny i uwzględnić SecurityPermissionFlag.SkipVerification w refusedPermissions
pliku . Uwzględnienie SkipVerification parametru refusedPermissions
gwarantuje, że MSIL zostanie zweryfikowany. Ograniczenie tej techniki polega również na tym, że jest SecurityException on również zgłaszany w przypadku użycia z kodem, który wymaga pełnego zaufania.
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>)
Definiuje zestaw dynamiczny o określonej nazwie, trybie dostępu i atrybutach niestandardowych.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb dostępu dla zestawu dynamicznego.
- assemblyAttributes
- IEnumerable<CustomAttributeBuilder>
Wyliczalna lista atrybutów, które mają być stosowane do zestawu, lub null
jeśli nie ma atrybutów.
Zwraca
Zestaw dynamiczny z określoną nazwą i funkcje.
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Przykłady
Poniższy przykładowy kod pokazuje, jak utworzyć zestaw dynamiczny z elementem SecurityTransparentAttribute. Atrybut musi być określony jako element tablicy CustomAttributeBuilder obiektów.
Pierwszym krokiem podczas tworzenia obiektu CustomAttributeBuilder jest uzyskanie konstruktora dla atrybutu. Konstruktor nie ma parametrów, więc GetConstructor metoda jest wywoływana z pustą tablicą Type obiektów reprezentujących typy parametrów. Drugim krokiem jest przekazanie wynikowego ConstructorInfo obiektu do konstruktora klasy CustomAttributeBuilder wraz z pustą tablicą typu Object reprezentującą argumenty.
CustomAttributeBuilder Wynik jest następnie przekazywany do DefineDynamicAssembly metody jako jedyny element tablicy.
Przykładowy kod definiuje moduł i typ w nowym zestawie dynamicznym, a następnie wyświetla atrybuty zestawu.
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
Uwagi
Ta metoda przeciążenia służy do określania atrybutów, które nie będą działać poprawnie, chyba że są one stosowane podczas tworzenia zestawu dynamicznego. Na przykład atrybuty zabezpieczeń, takie jak SecurityTransparentAttribute i SecurityCriticalAttribute nie działają poprawnie, jeśli są dodawane po utworzeniu zestawu dynamicznego.
Ta metoda powinna służyć tylko do definiowania zestawu dynamicznego w bieżącej domenie aplikacji. Aby uzyskać więcej informacji na temat tego ograniczenia, zobacz Load(AssemblyName) przeciążenie metody.
To przeciążenie metody jest wprowadzane w .NET Framework 3.5.
Zobacz też
Dotyczy
DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess)
Definiuje zestaw dynamiczny z określoną nazwą i trybem dostępu.
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
Parametry
- name
- AssemblyName
Unikatowa tożsamość zestawu dynamicznego.
- access
- AssemblyBuilderAccess
Tryb dostępu dla zestawu dynamicznego.
Zwraca
Zestaw dynamiczny z określoną nazwą i trybem dostępu.
Implementuje
Wyjątki
name
to null
.
Właściwość Name
to name
null
.
-lub-
Właściwość Name
zaczyna się od białego odstępu name
lub zawiera ukośnik do przodu lub do tyłu.
Próba wykonania operacji w niezaładowanej domenie aplikacji.
Przykłady
Poniższy przykład przedstawia metodę DefineDynamicAssembly i AssemblyResolve zdarzenie.
Aby ten przykładowy kod zadziałał, należy podać w pełni kwalifikowaną nazwę zestawu. Aby uzyskać informacje o sposobie uzyskania w pełni kwalifikowanej nazwy zestawu, zobacz Nazwy zestawów.
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
Uwagi
Ta metoda powinna służyć wyłącznie do definiowania zestawu dynamicznego w bieżącej domenie aplikacji. Aby uzyskać więcej informacji, zobacz przeciążenie Load(AssemblyName) metody.
Uwaga
Podczas opracowywania kodu, który emituje zestawy dynamiczne, zaleca się użycie przeciążenia DefineDynamicAssembly metody, która określa dowody i uprawnienia, podać dowody, które mają zawierać zestaw dynamiczny i uwzględnić SecurityPermissionFlag.SkipVerification w refusedPermissions
pliku . Uwzględnienie SkipVerification parametru refusedPermissions
gwarantuje, że MSIL zostanie zweryfikowany. Ograniczenie tej techniki polega również na tym, że jest SecurityException on również zgłaszany w przypadku użycia z kodem, który wymaga pełnego zaufania.