AppDomain.DefineDynamicAssembly 메서드

정의

현재 애플리케이션 도메인에서 동적 어셈블리를 정의합니다.Defines a dynamic assembly in the current application domain.

오버로드

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

지정한 이름, 액세스 모드, 스토리지 디렉터리, 증명 정보, 권한 요청, 동기화 옵션 및 사용자 지정 특성을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly with the specified name, access mode, storage directory, evidence, permission requests, synchronization option, and custom attributes.

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

지정한 이름, 액세스 모드, 스토리지 디렉터리, 증명 정보, 권한 요청 및 동기화 옵션을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, storage directory, evidence, permission requests, and synchronization option.

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

지정한 이름, 액세스 모드, 스토리지 디렉터리, 증명 정보 및 권한 요청을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, storage directory, evidence, and permission requests.

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

지정한 이름, 액세스 모드, 스토리지 디렉터리 및 권한 요청을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, storage directory, and permission requests.

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

지정한 이름, 액세스 모드, 증명 정보 및 권한 요청을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, evidence, and permission requests.

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

지정한 이름, 액세스 모드, 스토리지 디렉터리 및 동기화 옵션을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, storage directory, and synchronization option.

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

지정한 이름, 액세스 모드 및 권한 요청을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, and permission requests.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence)

지정한 이름, 액세스 모드, 스토리지 디렉터리 및 증명 정보를 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, storage directory, and evidence.

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

지정한 이름, 액세스 모드 및 사용자 지정 특성과 보안 컨텍스트에 대해 지정한 소스를 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly with the specified name, access mode, and custom attributes, and using the specified source for its security context.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String)

지정한 이름, 액세스 모드 및 스토리지 디렉터리를 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, and storage directory.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence)

지정한 이름, 액세스 모드 및 증명 정보를 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, and evidence.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>)

지정한 이름, 액세스 모드 및 사용자 지정 특성을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly with the specified name, access mode, and custom attributes.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess)

지정한 이름 및 액세스 모드를 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly with the specified name and access mode.

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

경고

이 API는 현재 사용되지 않습니다.

지정한 이름, 액세스 모드, 스토리지 디렉터리, 증명 정보, 권한 요청, 동기화 옵션 및 사용자 지정 특성을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly with the specified name, access mode, storage directory, evidence, permission requests, synchronization option, and custom attributes.

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);
[System.Obsolete("Declarative security for assembly level is no longer enforced")]
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See https://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

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리에 액세스하는 데 사용되는 모드입니다.The mode in which the dynamic assembly will be accessed.

dir
String

동적 어셈블리를 저장할 디렉터리 이름입니다.The name of the directory where the dynamic assembly will be saved. dirnull인 경우 현재 디렉터리가 사용됩니다.If dir is null, the current directory is used.

evidence
Evidence

동적 어셈블리에 제공된 증명 정보입니다.The evidence that is supplied for the dynamic assembly. 증명 정보는 변경되지 않고 정책 결정을 위한 최종 증명 정보로 사용됩니다.The evidence is used unaltered as the final set of evidence used for policy resolution.

requiredPermissions
PermissionSet

필수 권한 요청입니다.The required permissions request.

optionalPermissions
PermissionSet

선택적 권한 요청입니다.The optional permissions request.

refusedPermissions
PermissionSet

거부된 권한 요청입니다.The refused permissions request.

isSynchronized
Boolean

동적 어셈블리에서 모듈, 형식 및 멤버 만들기를 동기화하려면 true이고, 그러지 않으면 false입니다.true to synchronize the creation of modules, types, and members in the dynamic assembly; otherwise, false.

assemblyAttributes
IEnumerable<CustomAttributeBuilder>

어셈블리에 적용되는 특성의 열거형 목록이거나 특성이 없는 경우 null입니다.An enumerable list of attributes to be applied to the assembly, or null if there are no attributes.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

특성

예외

namenull인 경우name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함하는 경우The Name property of name starts with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

설명

동적 어셈블리를 만들 때 적용 되지 않는 한이 메서드 오버 로드를 사용 하 여 올바르게 작동 하지 않는 특성을 지정 합니다.Use this method overload to specify attributes that do not work correctly unless they are applied when a dynamic assembly is created. 예를 들어 동적 어셈블리를 만든 후에 추가 하는 경우 SecurityTransparentAttributeSecurityCriticalAttribute와 같은 보안 특성이 제대로 작동 하지 않습니다.For example, security attributes such as SecurityTransparentAttribute and SecurityCriticalAttribute do not work correctly if they are added after a dynamic assembly has been created.

requiredPermissions, optionalPermissionsrefusedPermissions 매개 변수에 대해 지정 된 사용 권한 요청은 evidence 매개 변수도 제공 하거나 동적 어셈블리를 메모리에 저장 하 고 다시 로드 하는 경우에만 사용 됩니다.The permission requests specified for the requiredPermissions, optionalPermissions, and refusedPermissions parameters are used only if the evidence parameter is also supplied, or if the dynamic assembly is saved and reloaded into memory.

참고

동적 어셈블리를 내보내는 코드를 개발 하는 경우 refusedPermissions 매개 변수에 SecurityPermissionFlag.SkipVerification 플래그를 포함 하는 것이 좋습니다.When you develop code that emits dynamic assemblies, we recommend that you include the SecurityPermissionFlag.SkipVerification flag in the refusedPermissions parameter. 이 플래그가 포함 되어 있으면 MSIL (Microsoft 중간 언어)이 확인 됩니다.The inclusion of this flag ensures that the Microsoft intermediate language (MSIL) will be verified. 이 기법은 비안정형 코드를 의도 하지 않은 세대를 검색 합니다. 그렇지 않으면 검색 하기가 매우 어렵습니다.This technique will detect the unintentional generation of unverifiable code, which otherwise is very difficult to detect. 이 기술의 제한 사항은 완전 신뢰를 요구 하는 코드와 함께 사용 될 때 SecurityException throw 되도록 하는 것입니다.A limitation of this technique is that it also causes SecurityException to be thrown when it is used with code that demands full trust.

동적 Assembly를 정의할 때 완전히 신뢰할 수 있는 호출자만 증명 정보를 제공할 수 있습니다.Only fully trusted callers can supply evidence when defining a dynamic Assembly. 런타임은 보안 정책을 통해 Evidence을 매핑하여 부여 된 사용 권한을 확인 합니다.The runtime maps the Evidence through the security policy to determine the granted permissions. 부분적으로 신뢰할 수 있는 호출자는 evidence 매개 변수에 대 한 null를 제공 해야 합니다.Partially trusted callers must supply null for the evidence parameter. evidence null되는 경우 런타임은 호출자의 어셈블리에서 권한 집합 (현재 grant 및 deny 집합)을 정의 되는 동적 어셈블리로 복사 하 고 정책을 해결 된 것으로 표시 합니다.If evidence is null, the runtime copies the permission sets (that is, the current grant and deny sets) from the caller's assembly to the dynamic assembly that is being defined, and marks the policy as resolved.

동적 어셈블리를 디스크에 저장 하는 경우 후속 로드는 동적 어셈블리를 저장 한 위치와 연결 된 정책에 따라 권한을 부여 받습니다.If the dynamic assembly is saved to disk, subsequent loads will get grants based on policies that are associated with the location where the dynamic assembly was saved.

isSynchronized true되는 경우 결과 AssemblyBuilder의 다음 메서드가 DefineDynamicModule, DefineResource, AddResourceFile, GetDynamicModule, SetEntryPointSave와 동기화 됩니다.If isSynchronized is true, the following methods of the resulting AssemblyBuilder will be synchronized: DefineDynamicModule, DefineResource, AddResourceFile, GetDynamicModule, SetEntryPoint, and Save. 이러한 메서드 중 두 개를 서로 다른 스레드에서 호출 하는 경우 다른 하나는 완료 될 때까지 차단 됩니다.If two of these methods are called on different threads, one will block until the other is completed.

이 메서드 오버 로드는 .NET Framework 3.5.NET Framework 3.5에서 도입 되었습니다.This method overload is introduced in the .NET Framework 3.5.NET Framework 3.5.

보안

SecurityPermission
증명 정보를 사용 하 여 어셈블리를 로드 합니다.to load an assembly with evidence. 연관된 열거형: ControlEvidenceAssociated enumeration: ControlEvidence.

추가 정보

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

경고

이 API는 현재 사용되지 않습니다.

지정한 이름, 액세스 모드, 스토리지 디렉터리, 증명 정보, 권한 요청 및 동기화 옵션을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, storage directory, evidence, permission requests, and synchronization option.

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.Obsolete("Declarative security for assembly level is no longer enforced")]
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See https://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);
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 -> System.Reflection.Emit.AssemblyBuilder

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리에 액세스하는 데 사용되는 모드입니다.The mode in which the dynamic assembly will be accessed.

dir
String

동적 어셈블리를 저장할 디렉터리 이름입니다.The name of the directory where the dynamic assembly will be saved. dirnull이면 현재 디렉터리가 기본값으로 지정됩니다.If dir is null, the directory defaults to the current directory.

evidence
Evidence

동적 어셈블리에 제공된 증명 정보입니다.The evidence supplied for the dynamic assembly. 증명 정보는 변경되지 않고 정책 결정을 위한 최종 증명 정보로 사용됩니다.The evidence is used unaltered as the final set of evidence used for policy resolution.

requiredPermissions
PermissionSet

필수 권한 요청입니다.The required permissions request.

optionalPermissions
PermissionSet

선택적 권한 요청입니다.The optional permissions request.

refusedPermissions
PermissionSet

거부된 권한 요청입니다.The refused permissions request.

isSynchronized
Boolean

동적 어셈블리에서 모듈, 형식 및 멤버 만들기를 동기화하려면 true이고, 그러지 않으면 false입니다.true to synchronize the creation of modules, types, and members in the dynamic assembly; otherwise, false.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

구현

특성

예외

namenull인 경우name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함합니다.The Name property of name begins with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

예제

다음 샘플에서는 DefineDynamicAssembly 메서드 및 AssemblyResolve 이벤트를 보여 줍니다.The following sample demonstrates the DefineDynamicAssembly method and AssemblyResolve event.

이 코드 예제를 실행 하려면 정규화 된 어셈블리 이름을 제공 해야 합니다.For this code example to run, you must provide the fully qualified assembly name. 참조 된 정규화 된 어셈블리 이름을 가져오는 방법에 대 한 내용은 어셈블리 이름합니다.For information about how to obtain the fully qualified assembly name, see Assembly Names.

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 Test {
   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;
   }
}

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 

설명

requiredPermissions, optionalPermissionsrefusedPermissions에 대해 지정 된 권한 요청은 evidence도 제공 하거나 동적 어셈블리를 저장 하 고 메모리에 다시 로드 하는 경우에만 사용 됩니다.The permission requests specified for requiredPermissions, optionalPermissions, and refusedPermissions are used only if evidence is also supplied, or if the dynamic assembly is saved and reloaded into memory.

참고

동적 어셈블리를 내보내는 코드를 개발 하는 동안 refusedPermissionsSecurityPermissionFlag.SkipVerification를 포함 하는 것이 좋습니다.During the development of code that emits dynamic assemblies, it is recommended that you include SecurityPermissionFlag.SkipVerification in refusedPermissions. refusedPermissions 매개 변수에 SkipVerification를 포함 하면 MSIL이 확인 됩니다.Including SkipVerification in the refusedPermissions parameter ensures that the MSIL is verified. 이 기술에는 완전 신뢰를 요구 하는 코드와 함께 사용 하는 경우에도 SecurityException throw 될 수 있다는 제한이 있습니다.A limitation of this technique is that it also causes SecurityException to be thrown when used with code that demands full trust.

동적 Assembly를 정의할 때 완전히 신뢰할 수 있는 호출자만 해당 증거를 제공할 수 있습니다.Only fully trusted callers can supply their evidence when defining a dynamic Assembly. 런타임은 보안 정책을 통해 Evidence을 매핑하여 부여 된 사용 권한을 확인 합니다.The runtime will map the Evidence through the security policy to determine the granted permissions. 부분적으로 신뢰할 수 있는 호출자는 evidence 매개 변수에 대 한 null를 제공 해야 합니다.Partially trusted callers must supply null for the evidence parameter. evidence null되는 경우 런타임은 호출자의 Assembly에서 정의 되는 동적 Assembly에 대 한 권한 집합, 즉 현재 grant 및 deny 집합을 복사 하 고 정책을 해결 된 것으로 표시 합니다.If evidence is null, the runtime copies the permission sets, that is, the current grant and deny sets, from the caller's Assembly to the dynamic Assembly being defined and marks policy as resolved.

동적 Assembly를 디스크에 저장 하는 경우 후속 로드는 Assembly 저장 된 위치와 연결 된 정책에 따라 권한을 부여 받습니다.If the dynamic Assembly is saved to disk, subsequent loads will get grants based on policies associated with the location where the Assembly was saved.

isSynchronized true되는 경우 결과 AssemblyBuilder의 다음 메서드가 DefineDynamicModule, DefineResource, AddResourceFile, GetDynamicModule, SetEntryPointSave와 동기화 됩니다.If isSynchronized is true, the following methods of the resulting AssemblyBuilder will be synchronized: DefineDynamicModule, DefineResource, AddResourceFile, GetDynamicModule, SetEntryPoint, and Save. 이러한 메서드 중 두 개를 서로 다른 스레드에서 호출 하는 경우 다른 하나는 완료 될 때까지 차단 됩니다.If two of these methods are called on different threads, one will block until the other completes.

보안

SecurityPermission
증명 정보를 사용 하 여 어셈블리를 로드 합니다.to load an assembly with evidence. 연관된 열거형: ControlEvidenceAssociated enumeration: ControlEvidence.

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

경고

이 API는 현재 사용되지 않습니다.

지정한 이름, 액세스 모드, 스토리지 디렉터리, 증명 정보 및 권한 요청을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, storage directory, evidence, and permission requests.

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);
[System.Obsolete("Declarative security for assembly level is no longer enforced")]
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default.  Please see https://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);
member 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

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리에 액세스하는 데 사용되는 모드입니다.The mode in which the dynamic assembly will be accessed.

dir
String

어셈블리가 저장될 디렉터리 이름입니다.The name of the directory where the assembly will be saved. dirnull이면 현재 디렉터리가 기본값으로 지정됩니다.If dir is null, the directory defaults to the current directory.

evidence
Evidence

동적 어셈블리에 제공된 증명 정보입니다.The evidence supplied for the dynamic assembly. 증명 정보는 변경되지 않고 정책 결정을 위한 최종 증명 정보로 사용됩니다.The evidence is used unaltered as the final set of evidence used for policy resolution.

requiredPermissions
PermissionSet

필수 권한 요청입니다.The required permissions request.

optionalPermissions
PermissionSet

선택적 권한 요청입니다.The optional permissions request.

refusedPermissions
PermissionSet

거부된 권한 요청입니다.The refused permissions request.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

구현

특성

예외

namenull입니다.name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함합니다.The Name property of name begins with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

예제

다음 샘플에서는 DefineDynamicAssembly 메서드 및 AssemblyResolve 이벤트를 보여 줍니다.The following sample demonstrates the DefineDynamicAssembly method and AssemblyResolve event.

이 코드 예제를 실행 하려면 정규화 된 어셈블리 이름을 제공 해야 합니다.For this code example to run, you must provide the fully qualified assembly name. 참조 된 정규화 된 어셈블리 이름을 가져오는 방법에 대 한 내용은 어셈블리 이름합니다.For information about how to obtain the fully qualified assembly name, see Assembly Names.

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 Test {
   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;
   }
}

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 

설명

requiredPermissions, optionalPermissionsrefusedPermissions에 대해 지정 된 권한 요청은 evidence도 제공 하거나 동적 어셈블리를 저장 하 고 메모리에 다시 로드 하는 경우에만 사용 됩니다.The permission requests specified for requiredPermissions, optionalPermissions, and refusedPermissions are used only if evidence is also supplied, or if the dynamic assembly is saved and reloaded into memory.

참고

동적 어셈블리를 내보내는 코드를 개발 하는 동안 refusedPermissionsSecurityPermissionFlag.SkipVerification를 포함 하는 것이 좋습니다.During the development of code that emits dynamic assemblies, it is recommended that you include SecurityPermissionFlag.SkipVerification in refusedPermissions. refusedPermissions 매개 변수에 SkipVerification를 포함 하면 MSIL이 확인 됩니다.Including SkipVerification in the refusedPermissions parameter ensures that the MSIL is verified. 이 기술에는 완전 신뢰를 요구 하는 코드와 함께 사용 하는 경우에도 SecurityException throw 될 수 있다는 제한이 있습니다.A limitation of this technique is that it also causes SecurityException to be thrown when used with code that demands full trust.

동적 Assembly를 정의할 때 완전히 신뢰할 수 있는 호출자만 해당 evidence를 제공할 수 있습니다.Only fully trusted callers can supply their evidence when defining a dynamic Assembly. 런타임은 보안 정책을 통해 Evidence을 매핑하여 부여 된 사용 권한을 확인 합니다.The runtime will map the Evidence through the security policy to determine the granted permissions. 부분적으로 신뢰할 수 있는 호출자는 null evidence를 제공 해야 합니다.Partially trusted callers must supply a null evidence. evidence null되는 경우 런타임은 호출자의 Assembly에서 정의 되는 동적 Assembly에 대 한 권한 집합, 즉 현재 grant 및 deny 집합을 복사 하 고 정책을 해결 된 것으로 표시 합니다.If evidence is null, the runtime copies the permission sets, that is, the current grant and deny sets, from the caller's Assembly to the dynamic Assembly being defined and marks policy as resolved.

동적 Assembly를 디스크에 저장 하는 경우 후속 로드는 Assembly 저장 된 위치와 연결 된 정책에 따라 권한을 부여 받습니다.If the dynamic Assembly is saved to disk, subsequent loads will get grants based on policies associated with the location where the Assembly was saved.

이 메서드는 현재 애플리케이션 도메인에서 동적 어셈블리를 정의 하만 사용 해야 합니다.This method should only be used to define a dynamic assembly in the current application domain. 자세한 내용은 Load(AssemblyName) 메서드 오버 로드를 참조 하세요.For more information, see the Load(AssemblyName) method overload.

보안

SecurityPermission
증명 정보를 사용 하 여 어셈블리를 로드 합니다.to load an assembly with evidence. 연관된 열거형: ControlEvidenceAssociated enumeration: ControlEvidence.

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

경고

이 API는 현재 사용되지 않습니다.

지정한 이름, 액세스 모드, 스토리지 디렉터리 및 권한 요청을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, storage directory, and permission requests.

public:
 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);
[System.Obsolete("Declarative security for assembly level is no longer enforced")]
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See https://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);
member 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

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리에 액세스하는 데 사용되는 모드입니다.The mode in which the dynamic assembly will be accessed.

dir
String

어셈블리가 저장될 디렉터리 이름입니다.The name of the directory where the assembly will be saved. dirnull이면 현재 디렉터리가 기본값으로 지정됩니다.If dir is null, the directory defaults to the current directory.

requiredPermissions
PermissionSet

필수 권한 요청입니다.The required permissions request.

optionalPermissions
PermissionSet

선택적 권한 요청입니다.The optional permissions request.

refusedPermissions
PermissionSet

거부된 권한 요청입니다.The refused permissions request.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

구현

특성

예외

namenull입니다.name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함합니다.The Name property of name begins with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

예제

다음 샘플에서는 DefineDynamicAssembly 메서드 및 AssemblyResolve 이벤트를 보여 줍니다.The following sample demonstrates the DefineDynamicAssembly method and AssemblyResolve event.

이 코드 예제를 실행 하려면 정규화 된 어셈블리 이름을 제공 해야 합니다.For this code example to run, you must provide the fully qualified assembly name. 참조 된 정규화 된 어셈블리 이름을 가져오는 방법에 대 한 내용은 어셈블리 이름합니다.For information about how to obtain the fully qualified assembly name, see Assembly Names.

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 Test {
   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;
   }
}

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 

설명

동적 어셈블리를 저장 하 고 메모리로 다시 로드 하지 않는 한 requiredPermissions, optionalPermissionsrefusedPermissions에 대해 지정 된 권한 요청은 사용 되지 않습니다.The permission requests specified for requiredPermissions, optionalPermissions, and refusedPermissions are not used unless the dynamic assembly has been saved and reloaded into memory. 디스크에 저장 되지 않는 임시 어셈블리에 대 한 권한 요청을 지정 하려면 요청 된 권한 뿐만 아니라 증명 정보를 지정 하는 DefineDynamicAssembly 메서드의 오버 로드를 사용 하 고 Evidence 개체를 제공 합니다.To specify permission requests for a transient assembly that is never saved to disk, use an overload of the DefineDynamicAssembly method that specifies evidence as well as requested permissions, and supply an Evidence object.

참고

동적 어셈블리를 내보내는 코드를 개발 하는 동안 증명 정보 및 사용 권한을 지정 하는 DefineDynamicAssembly 메서드의 오버 로드를 사용 하 고, 동적 어셈블리에 포함 하려는 증명 정보를 제공 하 고, refusedPermissionsSecurityPermissionFlag.SkipVerification를 포함 하는 것이 좋습니다.During the development of code that emits dynamic assemblies, it is recommended that you use an overload of the DefineDynamicAssembly method that specifies evidence and permissions, supply the evidence you want the dynamic assembly to have, and include SecurityPermissionFlag.SkipVerification in refusedPermissions. refusedPermissions 매개 변수에 SkipVerification를 포함 하면 MSIL이 확인 됩니다.Including SkipVerification in the refusedPermissions parameter ensures that the MSIL is verified. 이 기술에는 완전 신뢰를 요구 하는 코드와 함께 사용 하는 경우에도 SecurityException throw 될 수 있다는 제한이 있습니다.A limitation of this technique is that it also causes SecurityException to be thrown when used with code that demands full trust.

이 메서드는 현재 애플리케이션 도메인에서 동적 어셈블리를 정의 하만 사용 해야 합니다.This method should only be used to define a dynamic assembly in the current application domain. 자세한 내용은 Load(AssemblyName) 메서드 오버 로드를 참조 하세요.For more information, see the Load(AssemblyName) method overload.

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

경고

이 API는 현재 사용되지 않습니다.

지정한 이름, 액세스 모드, 증명 정보 및 권한 요청을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, evidence, and permission requests.

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("Declarative security for assembly level is no longer enforced")]
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default. See https://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);
member 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

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리에 액세스하는 데 사용되는 모드입니다.The mode in which the dynamic assembly will be accessed.

evidence
Evidence

동적 어셈블리에 제공된 증명 정보입니다.The evidence supplied for the dynamic assembly. 증명 정보는 변경되지 않고 정책 결정을 위한 최종 증명 정보로 사용됩니다.The evidence is used unaltered as the final set of evidence used for policy resolution.

requiredPermissions
PermissionSet

필수 권한 요청입니다.The required permissions request.

optionalPermissions
PermissionSet

선택적 권한 요청입니다.The optional permissions request.

refusedPermissions
PermissionSet

거부된 권한 요청입니다.The refused permissions request.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

구현

특성

예외

namenull인 경우name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함합니다.The Name property of name begins with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

예제

다음 샘플에서는 DefineDynamicAssembly 메서드 및 AssemblyResolve 이벤트를 보여 줍니다.The following sample demonstrates the DefineDynamicAssembly method and AssemblyResolve event.

이 코드 예제를 실행 하려면 정규화 된 어셈블리 이름을 제공 해야 합니다.For this code example to run, you must provide the fully qualified assembly name. 참조 된 정규화 된 어셈블리 이름을 가져오는 방법에 대 한 내용은 어셈블리 이름합니다.For information about how to obtain the fully qualified assembly name, see Assembly Names.

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 Test {
   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;
   }
}

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 

설명

requiredPermissions, optionalPermissionsrefusedPermissions에 대해 지정 된 권한 요청은 evidence도 제공 하거나 동적 어셈블리를 저장 하 고 메모리에 다시 로드 하는 경우에만 사용 됩니다.The permission requests specified for requiredPermissions, optionalPermissions, and refusedPermissions are used only if evidence is also supplied, or if the dynamic assembly is saved and reloaded into memory.

참고

동적 어셈블리를 내보내는 코드를 개발 하는 동안 refusedPermissionsSecurityPermissionFlag.SkipVerification를 포함 하는 것이 좋습니다.During the development of code that emits dynamic assemblies, it is recommended that you include SecurityPermissionFlag.SkipVerification in refusedPermissions. refusedPermissions 매개 변수에 SkipVerification를 포함 하면 MSIL이 확인 됩니다.Including SkipVerification in the refusedPermissions parameter ensures that the MSIL is verified. 이 기술에는 완전 신뢰를 요구 하는 코드와 함께 사용 하는 경우에도 SecurityException throw 될 수 있다는 제한이 있습니다.A limitation of this technique is that it also causes SecurityException to be thrown when used with code that demands full trust.

동적 Assembly를 정의할 때 완전히 신뢰할 수 있는 호출자만 해당 evidence를 제공할 수 있습니다.Only fully trusted callers can supply their evidence when defining a dynamic Assembly. 런타임은 보안 정책을 통해 Evidence을 매핑하여 부여 된 사용 권한을 확인 합니다.The runtime will map the Evidence through the security policy to determine the granted permissions. 부분적으로 신뢰할 수 있는 호출자는 null evidence를 제공 해야 합니다.Partially trusted callers must supply a null evidence. evidence null되는 경우 런타임은 호출자의 Assembly에서 정의 되는 동적 Assembly에 대 한 권한 집합, 즉 현재 grant 및 deny 집합을 복사 하 고 정책을 해결 된 것으로 표시 합니다.If evidence is null, the runtime copies the permission sets, that is, the current grant and deny sets, from the caller's Assembly to the dynamic Assembly being defined and marks policy as resolved.

동적 Assembly를 디스크에 저장 하는 경우 후속 로드는 Assembly 저장 된 위치와 연결 된 정책에 따라 권한을 부여 받습니다.If the dynamic Assembly is saved to disk, subsequent loads will get grants based on policies associated with the location where the Assembly was saved.

이 메서드는 현재 애플리케이션 도메인에서 동적 어셈블리를 정의 하만 사용 해야 합니다.This method should only be used to define a dynamic assembly in the current application domain. 자세한 내용은 Load(AssemblyName) 메서드 오버 로드를 참조 하세요.For more information, see the Load(AssemblyName) method overload.

보안

SecurityPermission
증명 정보를 사용 하 여 어셈블리를 로드 합니다.to load an assembly with evidence. 연관된 열거형: ControlEvidenceAssociated enumeration: ControlEvidence.

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

지정한 이름, 액세스 모드, 스토리지 디렉터리 및 동기화 옵션을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, storage directory, and synchronization option.

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

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리에 액세스하는 데 사용되는 모드입니다.The mode in which the dynamic assembly will be accessed.

dir
String

동적 어셈블리를 저장할 디렉터리 이름입니다.The name of the directory where the dynamic assembly will be saved. dirnull인 경우 현재 디렉터리가 사용됩니다.If dir is null, the current directory is used.

isSynchronized
Boolean

동적 어셈블리에서 모듈, 형식 및 멤버 만들기를 동기화하려면 true이고, 그러지 않으면 false입니다.true to synchronize the creation of modules, types, and members in the dynamic assembly; otherwise, false.

assemblyAttributes
IEnumerable<CustomAttributeBuilder>

어셈블리에 적용되는 특성의 열거형 목록이거나 특성이 없는 경우 null입니다.An enumerable list of attributes to be applied to the assembly, or null if there are no attributes.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

예외

namenull인 경우name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함하는 경우The Name property of name starts with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

설명

동적 어셈블리를 만들 때 적용 되지 않는 한이 메서드 오버 로드를 사용 하 여 올바르게 작동 하지 않는 특성을 지정 합니다.Use this method overload to specify attributes that do not work correctly unless they are applied when a dynamic assembly is created. 예를 들어 동적 어셈블리를 만든 후에 추가 하는 경우 SecurityTransparentAttributeSecurityCriticalAttribute와 같은 보안 특성이 제대로 작동 하지 않습니다.For example, security attributes such as SecurityTransparentAttribute and SecurityCriticalAttribute do not work correctly if they are added after a dynamic assembly has been created.

isSynchronized true되는 경우 결과 AssemblyBuilder의 다음 메서드가 DefineDynamicModule, DefineResource, AddResourceFile, GetDynamicModule, SetEntryPointSave와 동기화 됩니다.If isSynchronized is true, the following methods of the resulting AssemblyBuilder will be synchronized: DefineDynamicModule, DefineResource, AddResourceFile, GetDynamicModule, SetEntryPoint, and Save. 이러한 메서드 중 두 개를 서로 다른 스레드에서 호출 하는 경우 다른 하나는 완료 될 때까지 차단 됩니다.If two of these methods are called on different threads, one will block until the other is completed.

추가 정보

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

경고

이 API는 현재 사용되지 않습니다.

지정한 이름, 액세스 모드 및 권한 요청을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, and permission requests.

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("Declarative security for assembly level is no longer enforced")]
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default.  See https://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);
member 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

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리에 액세스하는 데 사용되는 모드입니다.The mode in which the dynamic assembly will be accessed.

requiredPermissions
PermissionSet

필수 권한 요청입니다.The required permissions request.

optionalPermissions
PermissionSet

선택적 권한 요청입니다.The optional permissions request.

refusedPermissions
PermissionSet

거부된 권한 요청입니다.The refused permissions request.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

구현

특성

예외

namenull인 경우name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함합니다.The Name property of name begins with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

예제

다음 샘플에서는 DefineDynamicAssembly 메서드 및 AssemblyResolve 이벤트를 보여 줍니다.The following sample demonstrates the DefineDynamicAssembly method and AssemblyResolve event.

이 코드 예제를 실행 하려면 정규화 된 어셈블리 이름을 제공 해야 합니다.For this code example to run, you must provide the fully qualified assembly name. 참조 된 정규화 된 어셈블리 이름을 가져오는 방법에 대 한 내용은 어셈블리 이름합니다.For information about how to obtain the fully qualified assembly name, see Assembly Names.

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 Test {
   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;
   }
}

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 

설명

동적 어셈블리를 저장 하 고 메모리로 다시 로드 하지 않는 한 requiredPermissions, optionalPermissionsrefusedPermissions에 대해 지정 된 권한 요청은 사용 되지 않습니다.The permission requests specified for requiredPermissions, optionalPermissions, and refusedPermissions are not used unless the dynamic assembly has been saved and reloaded into memory. 디스크에 저장 되지 않는 임시 어셈블리에 대 한 권한 요청을 지정 하려면 요청 된 권한 뿐만 아니라 증명 정보를 지정 하는 DefineDynamicAssembly 메서드의 오버 로드를 사용 하 고 Evidence 개체를 제공 합니다.To specify permission requests for a transient assembly that is never saved to disk, use an overload of the DefineDynamicAssembly method that specifies evidence as well as requested permissions, and supply an Evidence object.

참고

동적 어셈블리를 내보내는 코드를 개발 하는 동안 증명 정보 및 사용 권한을 지정 하는 DefineDynamicAssembly 메서드의 오버 로드를 사용 하 고, 동적 어셈블리에 포함 하려는 증명 정보를 제공 하 고, refusedPermissionsSecurityPermissionFlag.SkipVerification를 포함 하는 것이 좋습니다.During the development of code that emits dynamic assemblies, it is recommended that you use an overload of the DefineDynamicAssembly method that specifies evidence and permissions, supply the evidence you want the dynamic assembly to have, and include SecurityPermissionFlag.SkipVerification in refusedPermissions. refusedPermissions 매개 변수에 SkipVerification를 포함 하면 MSIL이 확인 됩니다.Including SkipVerification in the refusedPermissions parameter ensures that the MSIL is verified. 이 기술에는 완전 신뢰를 요구 하는 코드와 함께 사용 하는 경우에도 SecurityException throw 될 수 있다는 제한이 있습니다.A limitation of this technique is that it also causes SecurityException to be thrown when used with code that demands full trust.

이 메서드는 현재 애플리케이션 도메인에서 동적 어셈블리를 정의 하만 사용 해야 합니다.This method should only be used to define a dynamic assembly in the current application domain. 자세한 내용은 Load(AssemblyName) 메서드 오버 로드를 참조 하세요.For more information, see the Load(AssemblyName) method overload .

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String, Evidence)

경고

이 API는 현재 사용되지 않습니다.

지정한 이름, 액세스 모드, 스토리지 디렉터리 및 증명 정보를 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, storage directory, and evidence.

public:
 System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::String ^ dir, System::Security::Policy::Evidence ^ evidence);
[System.Obsolete("Declarative security for assembly level is no longer enforced")]
[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 https://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);
member this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * string * System.Security.Policy.Evidence -> System.Reflection.Emit.AssemblyBuilder

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리에 액세스하는 데 사용되는 모드입니다.The mode in which the dynamic assembly will be accessed.

dir
String

어셈블리가 저장될 디렉터리 이름입니다.The name of the directory where the assembly will be saved. dirnull이면 현재 디렉터리가 기본값으로 지정됩니다.If dir is null, the directory defaults to the current directory.

evidence
Evidence

동적 어셈블리에 제공된 증명 정보입니다.The evidence supplied for the dynamic assembly. 증명 정보는 변경되지 않고 정책 결정을 위한 최종 증명 정보로 사용됩니다.The evidence is used unaltered as the final set of evidence used for policy resolution.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

구현

특성

예외

namenull인 경우name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함합니다.The Name property of name begins with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

예제

다음 샘플에서는 DefineDynamicAssembly 메서드 및 AssemblyResolve 이벤트를 보여 줍니다.The following sample demonstrates the DefineDynamicAssembly method and AssemblyResolve event.

이 코드 예제를 실행 하려면 정규화 된 어셈블리 이름을 제공 해야 합니다.For this code example to run, you must provide the fully qualified assembly name. 참조 된 정규화 된 어셈블리 이름을 가져오는 방법에 대 한 내용은 어셈블리 이름합니다.For information about how to obtain the fully qualified assembly name, see Assembly Names.

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 Test {
   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;
   }
}

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 

설명

동적 Assembly를 정의할 때 완전히 신뢰할 수 있는 호출자만 해당 evidence를 제공할 수 있습니다.Only fully trusted callers can supply their evidence when defining a dynamic Assembly. 런타임은 보안 정책을 통해 Evidence을 매핑하여 부여 된 사용 권한을 확인 합니다.The runtime will map the Evidence through the security policy to determine the granted permissions. 부분적으로 신뢰할 수 있는 호출자는 null evidence를 제공 해야 합니다.Partially trusted callers must supply a null evidence. evidence null되는 경우 런타임은 호출자의 Assembly에서 정의 되는 동적 Assembly에 대 한 권한 집합, 즉 현재 grant 및 deny 집합을 복사 하 고 정책을 해결 된 것으로 표시 합니다.If evidence is null, the runtime copies the permission sets, that is, the current grant and deny sets, from the caller's Assembly to the dynamic Assembly being defined and marks policy as resolved.

동적 Assembly를 디스크에 저장 하는 경우 후속 로드는 Assembly 저장 된 위치와 연결 된 정책에 따라 권한을 부여 받습니다.If the dynamic Assembly is saved to disk, subsequent loads will get grants based on policies associated with the location where the Assembly was saved.

이 메서드는 현재 애플리케이션 도메인에서 동적 어셈블리를 정의 하만 사용 해야 합니다.This method should only be used to define a dynamic assembly in the current application domain. 자세한 내용은 Load(AssemblyName) 메서드 오버 로드를 참조 하세요.For more information, see the Load(AssemblyName) method overload.

참고

동적 어셈블리를 내보내는 코드를 개발 하는 동안 증명 정보 및 사용 권한을 지정 하는 DefineDynamicAssembly 메서드의 오버 로드를 사용 하 고, 동적 어셈블리에 포함 하려는 증명 정보를 제공 하 고, refusedPermissionsSecurityPermissionFlag.SkipVerification를 포함 하는 것이 좋습니다.During the development of code that emits dynamic assemblies, it is recommended that you use an overload of the DefineDynamicAssembly method that specifies evidence and permissions, supply the evidence you want the dynamic assembly to have, and include SecurityPermissionFlag.SkipVerification in refusedPermissions. refusedPermissions 매개 변수에 SkipVerification를 포함 하면 MSIL이 확인 됩니다.Including SkipVerification in the refusedPermissions parameter ensures that the MSIL is verified. 이 기술에는 완전 신뢰를 요구 하는 코드와 함께 사용 하는 경우에도 SecurityException throw 될 수 있다는 제한이 있습니다.A limitation of this technique is that it also causes SecurityException to be thrown when used with code that demands full trust.

보안

SecurityPermission
증명 정보를 사용 하 여 어셈블리를 로드 합니다.to load an assembly with evidence. 연관된 열거형: ControlEvidenceAssociated enumeration: ControlEvidence.

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

지정한 이름, 액세스 모드 및 사용자 지정 특성과 보안 컨텍스트에 대해 지정한 소스를 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly with the specified name, access mode, and custom attributes, and using the specified source for its security context.

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

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리의 액세스 모드입니다.The access mode for the dynamic assembly.

assemblyAttributes
IEnumerable<CustomAttributeBuilder>

어셈블리에 적용되는 특성의 열거형 목록이거나 특성이 없는 경우 null입니다.An enumerable list of attributes to be applied to the assembly, or null if there are no attributes.

securityContextSource
SecurityContextSource

보안 컨텍스트의 소스입니다.The source of the security context.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

예외

namenull인 경우name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함하는 경우The Name property of name starts with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

securityContextSource의 값이 열거형 값 중 하나가 아니었습니다.The value of securityContextSource was not one of the enumeration values.

설명

동적 어셈블리를 만들 때 적용 되지 않는 한이 메서드 오버 로드를 사용 하 여 올바르게 작동 하지 않는 특성을 지정 합니다.Use this method overload to specify attributes that do not work correctly unless they are applied when a dynamic assembly is created. 예를 들어 동적 어셈블리를 만든 후에 추가 하는 경우 SecurityTransparentAttributeSecurityCriticalAttribute와 같은 보안 특성이 제대로 작동 하지 않습니다.For example, security attributes such as SecurityTransparentAttribute and SecurityCriticalAttribute do not work correctly if they are added after a dynamic assembly has been created.

현재 애플리케이션 도메인에서 동적 어셈블리를 정의에이 메서드를 사용 해야 합니다.This method should be used only to define a dynamic assembly in the current application domain. 이 제한에 대 한 자세한 내용은 Load(AssemblyName) 메서드 오버 로드를 참조 하세요.For more information about this restriction, see the Load(AssemblyName) method overload.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, String)

지정한 이름, 액세스 모드 및 스토리지 디렉터리를 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, and storage directory.

public:
 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);
member 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

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리에 액세스하는 데 사용되는 모드입니다.The mode in which the dynamic assembly will be accessed.

dir
String

어셈블리가 저장될 디렉터리 이름입니다.The name of the directory where the assembly will be saved. dirnull이면 현재 디렉터리가 기본값으로 지정됩니다.If dir is null, the directory defaults to the current directory.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

구현

예외

namenull인 경우name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함합니다.The Name property of name begins with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

예제

다음 샘플에서는 DefineDynamicAssembly 메서드 및 AssemblyResolve 이벤트를 보여 줍니다.The following sample demonstrates the DefineDynamicAssembly method and AssemblyResolve event.

이 코드 예제를 실행 하려면 정규화 된 어셈블리 이름을 제공 해야 합니다.For this code example to run, you must provide the fully qualified assembly name. 참조 된 정규화 된 어셈블리 이름을 가져오는 방법에 대 한 내용은 어셈블리 이름합니다.For information about how to obtain the fully qualified assembly name, see Assembly Names.

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 Test {
   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;
   }
}

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 

설명

이 메서드는 현재 애플리케이션 도메인에서 동적 어셈블리를 정의 하만 사용 해야 합니다.This method should only be used to define a dynamic assembly in the current application domain. 자세한 내용은 Load(AssemblyName) 메서드 오버 로드를 참조 하세요.For more information, see the Load(AssemblyName) method overload.

참고

동적 어셈블리를 내보내는 코드를 개발 하는 동안 증명 정보 및 사용 권한을 지정 하는 DefineDynamicAssembly 메서드의 오버 로드를 사용 하 고, 동적 어셈블리에 포함 하려는 증명 정보를 제공 하 고, refusedPermissionsSecurityPermissionFlag.SkipVerification를 포함 하는 것이 좋습니다.During the development of code that emits dynamic assemblies, it is recommended that you use an overload of the DefineDynamicAssembly method that specifies evidence and permissions, supply the evidence you want the dynamic assembly to have, and include SecurityPermissionFlag.SkipVerification in refusedPermissions. refusedPermissions 매개 변수에 SkipVerification를 포함 하면 MSIL이 확인 됩니다.Including SkipVerification in the refusedPermissions parameter ensures that the MSIL is verified. 이 기술에는 완전 신뢰를 요구 하는 코드와 함께 사용 하는 경우에도 SecurityException throw 될 수 있다는 제한이 있습니다.A limitation of this technique is that it also causes SecurityException to be thrown when used with code that demands full trust.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, Evidence)

경고

이 API는 현재 사용되지 않습니다.

지정한 이름, 액세스 모드 및 증명 정보를 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly using the specified name, access mode, and evidence.

public:
 System::Reflection::Emit::AssemblyBuilder ^ DefineDynamicAssembly(System::Reflection::AssemblyName ^ name, System::Reflection::Emit::AssemblyBuilderAccess access, System::Security::Policy::Evidence ^ evidence);
[System.Obsolete("Declarative security for assembly level is no longer enforced")]
[System.Obsolete("Assembly level declarative security is obsolete and is no longer enforced by the CLR by default.  See https://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);
member this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess * System.Security.Policy.Evidence -> System.Reflection.Emit.AssemblyBuilder

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리에 액세스하는 데 사용되는 모드입니다.The mode in which the dynamic assembly will be accessed.

evidence
Evidence

동적 어셈블리에 제공된 증명 정보입니다.The evidence supplied for the dynamic assembly. 증명 정보는 변경되지 않고 정책 결정을 위한 최종 증명 정보로 사용됩니다.The evidence is used unaltered as the final set of evidence used for policy resolution.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

구현

특성

예외

namenull입니다.name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함합니다.The Name property of name begins with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

예제

다음 샘플에서는 DefineDynamicAssembly 메서드와 AssemblyResolve 이벤트를 보여 줍니다.The following sample demonstrates the DefineDynamicAssembly method and the AssemblyResolve event.

첫째, 코드 예제에서는 잘못 된 어셈블리 이름을 사용 하 여 CreateInstance 메서드를 호출 하 고 결과 예외를 catch 하 여 MyDynamicType의 인스턴스를 만들려고 시도 합니다.First, the code example tries to create an instance of MyDynamicType by calling the CreateInstance method with an invalid assembly name, and catches the resulting exception.

그런 다음 코드 예제에서는 AssemblyResolve 이벤트에 대 한 이벤트 처리기를 추가 하 고MyDynamicType의 인스턴스를 다시 만들려고 시도 합니다.The code example then adds an event handler for the AssemblyResolve event, and again tries to create an instance ofMyDynamicType. CreateInstance를 호출 하는 동안 잘못 된 어셈블리에 대 한 AssemblyResolve 이벤트가 발생 합니다.During the call to CreateInstance, the AssemblyResolve event is raised for the invalid assembly. 이벤트 처리기는 MyDynamicType이라는 형식이 포함 된 동적 어셈블리를 만들고, 해당 형식을 매개 변수가 없는 생성자로 제공 하 고, 새 동적 어셈블리를 반환 합니다.The event handler creates a dynamic assembly that contains a type named MyDynamicType, gives the type a parameterless constructor, and returns the new dynamic assembly. CreateInstance에 대 한 호출이 성공적으로 완료 되 고 MyDynamicType 생성자는 콘솔에 메시지를 표시 합니다.The call to CreateInstance then finishes successfully, and the constructor for MyDynamicType displays a message at the console.

using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
ref class Test
{
public:
   static void InstantiateMyDynamicType( AppDomain^ domain )
   {
      try
      {
         
         // You must supply a valid fully qualified assembly name here.
         domain->CreateInstance( "Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType" );
      }
      catch ( Exception^ e ) 
      {
         Console::WriteLine( e->Message );
      }

   }

   static Assembly^ MyResolveEventHandler( Object^ sender, ResolveEventArgs^ args )
   {
      return DefineDynamicAssembly( dynamic_cast<AppDomain^>(sender) );
   }

   static Assembly^ DefineDynamicAssembly( AppDomain^ domain )
   {
      
      // Build a dynamic assembly using Reflection Emit API.
      AssemblyName^ assemblyName = gcnew AssemblyName;
      assemblyName->Name = "MyDynamicAssembly";
      AssemblyBuilder^ assemblyBuilder = domain->DefineDynamicAssembly( assemblyName, AssemblyBuilderAccess::Run );
      ModuleBuilder^ moduleBuilder = assemblyBuilder->DefineDynamicModule( "MyDynamicModule" );
      TypeBuilder^ typeBuilder = moduleBuilder->DefineType( "MyDynamicType", TypeAttributes::Public );
      ConstructorBuilder^ constructorBuilder = typeBuilder->DefineConstructor( MethodAttributes::Public, CallingConventions::Standard, nullptr );
      ILGenerator^ ilGenerator = constructorBuilder->GetILGenerator();
      ilGenerator->EmitWriteLine( "MyDynamicType instantiated!" );
      ilGenerator->Emit( OpCodes::Ret );
      typeBuilder->CreateType();
      return assemblyBuilder;
   }

};

int main()
{
   AppDomain^ currentDomain = AppDomain::CurrentDomain;
   Test::InstantiateMyDynamicType( currentDomain ); // Failed!
   currentDomain->AssemblyResolve += gcnew ResolveEventHandler( Test::MyResolveEventHandler );
   Test::InstantiateMyDynamicType( currentDomain ); // OK!
}

using System;
using System.Reflection;
using System.Reflection.Emit;

class Test {
   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;
   }
}

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 

설명

동적 Assembly를 정의할 때 완전히 신뢰할 수 있는 호출자만 해당 evidence를 제공할 수 있습니다.Only fully trusted callers can supply their evidence when defining a dynamic Assembly. 런타임은 보안 정책을 통해 Evidence을 매핑하여 부여 된 사용 권한을 확인 합니다.The runtime will map the Evidence through the security policy to determine the granted permissions. 부분적으로 신뢰할 수 있는 호출자는 null evidence를 제공 해야 합니다.Partially trusted callers must supply a null evidence. evidence null되는 경우 런타임은 호출자의 Assembly에서 정의 되는 동적 Assembly에 대 한 권한 집합, 즉 현재 grant 및 deny 집합을 복사 하 고 정책을 해결 된 것으로 표시 합니다.If evidence is null, the runtime copies the permission sets, that is, the current grant and deny sets, from the caller's Assembly to the dynamic Assembly being defined and marks policy as resolved.

동적 Assembly를 디스크에 저장 하는 경우 후속 로드는 Assembly 저장 된 위치와 연결 된 정책에 따라 권한을 부여 받습니다.If the dynamic Assembly is saved to disk, subsequent loads will get grants based on policies associated with the location where the Assembly was saved.

이 메서드는 현재 애플리케이션 도메인에서 동적 어셈블리를 정의 하만 사용 해야 합니다.This method should only be used to define a dynamic assembly in the current application domain. 자세한 내용은 Load(AssemblyName) 메서드 오버 로드를 참조 하세요.For more information, see the Load(AssemblyName) method overload.

참고

동적 어셈블리를 내보내는 코드를 개발 하는 동안 증명 정보 및 사용 권한을 지정 하는 DefineDynamicAssembly 메서드의 오버 로드를 사용 하 고, 동적 어셈블리에 포함 하려는 증명 정보를 제공 하 고, refusedPermissionsSecurityPermissionFlag.SkipVerification를 포함 하는 것이 좋습니다.During the development of code that emits dynamic assemblies, it is recommended that you use an overload of the DefineDynamicAssembly method that specifies evidence and permissions, supply the evidence you want the dynamic assembly to have, and include SecurityPermissionFlag.SkipVerification in refusedPermissions. refusedPermissions 매개 변수에 SkipVerification를 포함 하면 MSIL이 확인 됩니다.Including SkipVerification in the refusedPermissions parameter ensures that the MSIL is verified. 이 기술에는 완전 신뢰를 요구 하는 코드와 함께 사용 하는 경우에도 SecurityException throw 될 수 있다는 제한이 있습니다.A limitation of this technique is that it also causes SecurityException to be thrown when used with code that demands full trust.

보안

SecurityPermission
증명 정보를 사용 하 여 어셈블리를 로드 합니다.to load an assembly with evidence. 연관된 열거형: ControlEvidenceAssociated enumeration: ControlEvidence.

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess, IEnumerable<CustomAttributeBuilder>)

지정한 이름, 액세스 모드 및 사용자 지정 특성을 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly with the specified name, access mode, and custom attributes.

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

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리의 액세스 모드입니다.The access mode for the dynamic assembly.

assemblyAttributes
IEnumerable<CustomAttributeBuilder>

어셈블리에 적용되는 특성의 열거형 목록이거나 특성이 없는 경우 null입니다.An enumerable list of attributes to be applied to the assembly, or null if there are no attributes.

반환

지정한 이름 및 기능을 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and features.

예외

namenull인 경우name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함하는 경우The Name property of name starts with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

예제

다음 코드 샘플에서는 SecurityTransparentAttribute포함 된 동적 어셈블리를 만드는 방법을 보여 줍니다.The following code sample shows how to create a dynamic assembly that has the SecurityTransparentAttribute. 특성은 CustomAttributeBuilder 개체 배열의 요소로 지정 해야 합니다.The attribute must be specified as an element of an array of CustomAttributeBuilder objects.

CustomAttributeBuilder를 만드는 첫 번째 단계는 특성에 대 한 생성자를 가져오는 것입니다.The first step in creating the CustomAttributeBuilder is to obtain a constructor for the attribute. 생성자에는 매개 변수가 없으므로 GetConstructor 메서드는 매개 변수의 형식을 나타내는 Type 개체의 빈 배열을 사용 하 여 호출 됩니다.The constructor has no parameters, so the GetConstructor method is called with an empty array of Type objects to represent the types of the parameters. 두 번째 단계는 결과 ConstructorInfo 개체를 CustomAttributeBuilder 클래스의 생성자에 전달 하 고 인수를 나타내는 Object 형식의 빈 배열과 함께 전달 하는 것입니다.The second step is to pass the resulting ConstructorInfo object to the constructor for the CustomAttributeBuilder class, together with an empty array of type Object to represent the arguments.

그러면 결과 CustomAttributeBuilder이 배열의 유일한 요소로 DefineDynamicAssembly 메서드에 전달 됩니다.The resulting CustomAttributeBuilder is then passed to the DefineDynamicAssembly method as the only element of an array.

예제 코드는 새 동적 어셈블리에서 모듈 및 형식을 정의한 다음 어셈블리의 특성을 표시 합니다.The example code defines a module and a type in the new dynamic assembly, and then displays the assembly's attributes.

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 Example
{
    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
 */
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

설명

동적 어셈블리를 만들 때 적용 되지 않는 한이 메서드 오버 로드를 사용 하 여 올바르게 작동 하지 않는 특성을 지정 합니다.Use this method overload to specify attributes that do not work correctly unless they are applied when a dynamic assembly is created. 예를 들어 동적 어셈블리를 만든 후에 추가 하는 경우 SecurityTransparentAttributeSecurityCriticalAttribute와 같은 보안 특성이 제대로 작동 하지 않습니다.For example, security attributes such as SecurityTransparentAttribute and SecurityCriticalAttribute do not work correctly if they are added after a dynamic assembly has been created.

현재 애플리케이션 도메인에서 동적 어셈블리를 정의에이 메서드를 사용 해야 합니다.This method should be used only to define a dynamic assembly in the current application domain. 이 제한에 대 한 자세한 내용은 Load(AssemblyName) 메서드 오버 로드를 참조 하세요.For more information about this restriction, see the Load(AssemblyName) method overload.

이 메서드 오버 로드는 .NET Framework 3.5.NET Framework 3.5에서 도입 되었습니다.This method overload is introduced in the .NET Framework 3.5.NET Framework 3.5.

추가 정보

DefineDynamicAssembly(AssemblyName, AssemblyBuilderAccess)

지정한 이름 및 액세스 모드를 사용하여 동적 어셈블리를 정의합니다.Defines a dynamic assembly with the specified name and access mode.

public:
 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);
member this.DefineDynamicAssembly : System.Reflection.AssemblyName * System.Reflection.Emit.AssemblyBuilderAccess -> System.Reflection.Emit.AssemblyBuilder
Public Function DefineDynamicAssembly (name As AssemblyName, access As AssemblyBuilderAccess) As AssemblyBuilder

매개 변수

name
AssemblyName

동적 어셈블리의 고유 ID입니다.The unique identity of the dynamic assembly.

access
AssemblyBuilderAccess

동적 어셈블리의 액세스 모드입니다.The access mode for the dynamic assembly.

반환

지정한 이름 및 액세스 모드를 사용하는 동적 어셈블리입니다.A dynamic assembly with the specified name and access mode.

구현

예외

namenull인 경우name is null.

nameName 속성이 null입니다.The Name property of name is null.

또는-or- nameName 속성이 공백으로 시작하거나 슬래시 또는 백슬래시를 포함합니다.The Name property of name begins with white space, or contains a forward or backward slash.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

예제

다음 샘플에서는 DefineDynamicAssembly 메서드 및 AssemblyResolve 이벤트를 보여 줍니다.The following sample demonstrates the DefineDynamicAssembly method and AssemblyResolve event.

이 코드 예제를 실행 하려면 정규화 된 어셈블리 이름을 제공 해야 합니다.For this code example to run, you must provide the fully qualified assembly name. 참조 된 정규화 된 어셈블리 이름을 가져오는 방법에 대 한 내용은 어셈블리 이름합니다.For information about how to obtain the fully qualified assembly name, see Assembly Names.

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 Test {
   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;
   }
}

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 

설명

이 메서드는 현재 애플리케이션 도메인에서 동적 어셈블리를 정의 하만 사용 해야 합니다.This method should only be used to define a dynamic assembly in the current application domain. 자세한 내용은 Load(AssemblyName) 메서드 오버 로드를 참조 하세요.For more information, see the Load(AssemblyName) method overload.

참고

동적 어셈블리를 내보내는 코드를 개발 하는 동안 증명 정보 및 사용 권한을 지정 하는 DefineDynamicAssembly 메서드의 오버 로드를 사용 하 고, 동적 어셈블리에 포함 하려는 증명 정보를 제공 하 고, refusedPermissionsSecurityPermissionFlag.SkipVerification를 포함 하는 것이 좋습니다.During the development of code that emits dynamic assemblies, it is recommended that you use an overload of the DefineDynamicAssembly method that specifies evidence and permissions, supply the evidence you want the dynamic assembly to have, and include SecurityPermissionFlag.SkipVerification in refusedPermissions. refusedPermissions 매개 변수에 SkipVerification를 포함 하면 MSIL이 확인 됩니다.Including SkipVerification in the refusedPermissions parameter ensures that the MSIL is verified. 이 기술에는 완전 신뢰를 요구 하는 코드와 함께 사용 하는 경우에도 SecurityException throw 될 수 있다는 제한이 있습니다.A limitation of this technique is that it also causes SecurityException to be thrown when used with code that demands full trust.

적용 대상