System.Reflection.Emit.DynamicMethod 클래스

이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.

클래스를 DynamicMethod 사용하여 메서드를 포함할 동적 어셈블리 및 동적 형식을 생성하지 않고도 런타임에 메서드를 생성하고 실행할 수 있습니다. JIT(Just-In-Time) 컴파일러에서 만든 실행 코드는 개체를 회수할 때 DynamicMethod 회수됩니다. 동적 메서드는 소량의 코드를 생성하고 실행하는 가장 효율적인 방법입니다.

동적 메서드는 익명으로 호스트되거나 모듈 또는 형식과 논리적으로 연결될 수 있습니다.

  • 동적 메서드가 익명으로 호스트되는 경우 시스템 제공 어셈블리에 있으므로 다른 코드와 격리됩니다. 기본적으로 공용이 아닌 데이터에 대한 액세스 권한은 없습니다. 익명으로 호스트되는 동적 메서드는 플래그를 사용하여 부여된 경우 JIT 컴파일러의 표시 유형 검사 건너뛰는 기능이 제한될 ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess 수 있습니다. 동적 메서드에서 비공용 멤버에 액세스하는 어셈블리의 신뢰 수준은 동적 메서드를 내보낸 호출 스택의 신뢰 수준 또는 하위 집합과 같아야 합니다. 익명으로 호스트되는 동적 메서드 에 대한 자세한 내용은 연습: 부분 신뢰 시나리오에서 코드 내보내기를 참조하세요.

  • 동적 메서드가 지정한 모듈과 연결된 경우 동적 메서드는 해당 모듈에 효과적으로 전역화됩니다. 모듈의 모든 형식과 형식의 모든 internal (Friend Visual Basic) 멤버에 액세스할 수 있습니다. 코드를 포함하는 호출 스택에서 플래그에 대한 ReflectionPermission 요구를 충족할 수 있는 경우 모듈을 만들었는지 여부에 관계없이 동적 메서드를 모듈과 RestrictedMemberAccess 연결할 수 있습니다. 권한 부여에 ReflectionPermissionFlag.MemberAccess 플래그가 포함된 경우 동적 메서드는 JIT 컴파일러의 표시 유형 검사 건너뛰고 모듈 또는 어셈블리의 다른 모듈에 선언된 모든 형식의 프라이빗 데이터에 액세스할 수 있습니다.

    참고 항목

    동적 메서드가 연결된 모듈을 지정하는 경우 해당 모듈은 익명 호스팅에 사용되는 시스템 제공 어셈블리에 있으면 안 됩니다.

  • 동적 메서드가 지정한 형식과 연결된 경우 액세스 수준에 관계없이 형식의 모든 멤버에 액세스할 수 있습니다. 또한 JIT 표시 유형 검사 건너뛸 수 있습니다. 이렇게 하면 동적 메서드가 동일한 모듈 또는 어셈블리의 다른 모듈에 선언된 다른 형식의 프라이빗 데이터에 액세스할 수 있습니다. 동적 메서드를 모든 형식과 연결할 수 있지만 코드와 플래그를 모두 RestrictedMemberAccessMemberAccess 부여 ReflectionPermission 해야 합니다.

다음 표에서는 플래그가 부여되었는지 여부에 ReflectionPermission 따라 JIT 표시 유형 검사 포함 또는 사용하지 않고 익명으로 호스트되는 동적 메서드에 액세스할 수 있는 형식과 멤버를 RestrictedMemberAccess 보여 줍니다.

표시 유형 검사 RestrictedMemberAccess 사용 안 함 RestrictedMemberAccess 사용
JIT 표시 유형 검사 건너뛰지 않고 모든 어셈블리에 있는 public 형식의 공용 멤버입니다. 모든 어셈블리에 있는 public 형식의 공용 멤버입니다.
JIT 표시 유형 검사 건너뛰기(제한 사항) 모든 어셈블리에 있는 public 형식의 공용 멤버입니다. 모든 형식의 모든 멤버는 트러스트 수준이 동적 메서드를 내보낸 어셈블리의 신뢰 수준과 같거나 작은 어셈블리에서만 가능합니다.

다음 표에서는 모듈 또는 모듈의 형식과 연결된 동적 메서드에 액세스할 수 있는 형식과 멤버를 보여 있습니다.

JIT 표시 유형 검사 건너뛰기 모듈과 연결됨 형식과 연결됨
아니요 모듈의 공용, 내부 및 프라이빗 형식의 공용 및 내부 멤버입니다.

모든 어셈블리에 있는 public 형식의 공용 멤버입니다.
연결된 형식의 모든 멤버입니다. 모듈에 있는 다른 모든 형식의 공용 및 내부 멤버입니다.

모든 어셈블리에 있는 public 형식의 공용 멤버입니다.
모든 어셈블리에 있는 모든 형식의 모든 멤버입니다. 모든 어셈블리에 있는 모든 형식의 모든 멤버입니다.

모듈과 연결된 동적 메서드에는 해당 모듈의 권한이 있습니다. 형식과 연결된 동적 메서드에는 해당 형식을 포함하는 모듈의 권한이 있습니다.

동적 메서드 및 해당 매개 변수의 이름을 지정할 필요는 없지만 디버깅에 도움이 되는 이름을 지정할 수 있습니다. 사용자 지정 특성은 동적 메서드 또는 해당 매개 변수에서 지원되지 않습니다.

동적 메서드는 static 메서드(Shared Visual Basic의 메서드)이지만 대리자 바인딩에 대한 완화된 규칙을 사용하면 동적 메서드를 개체에 바인딩할 수 있으므로 해당 대리자 인스턴스를 사용하여 호출할 때 인스턴스 메서드처럼 작동합니다. 메서드 오버로드에 대해 CreateDelegate(Type, Object) 제공되는 예제입니다.

확인

다음 목록에는 동적 메서드에 확인할 수 없는 코드가 포함될 수 있는 조건이 요약되어 있습니다. 예를 들어 속성이 .로 설정된 false경우 InitLocals 동적 메서드를 사용할 수 없습니다.

  • 보안에 중요한 어셈블리와 연결된 동적 메서드도 보안에 중요하며 확인을 건너뛸 수 있습니다. 예를 들어, 데스크톱 애플리케이션으로 실행 되는 보안 특성 없이 어셈블리는 런타임에서 보안에 중요로 처리 됩니다. 동적 메서드를 어셈블리와 연결하면 동적 메서드에 확인할 수 없는 코드가 포함될 수 있습니다.
  • 확인되지 않는 코드를 포함하는 동적 메서드가 수준 1 투명도가 있는 어셈블리와 연결된 경우 JIT(Just-In-Time) 컴파일러는 보안 요구를 주입합니다. 동적 메서드가 완전히 신뢰할 수 있는 코드에 의해 실행되는 경우에만 요청이 성공합니다. 보안 투명 코드, 수준 1을 참조하세요.
  • 확인되지 않는 코드를 포함하는 동적 메서드가 수준 2 투명도(예: mscorlib.dll)가 있는 어셈블리와 연결된 경우 보안 요구 대신 예외(JIT 컴파일러에 의해 삽입됨)를 throw합니다. 보안 투명 코드 수준 2를 참조하세요.
  • 확인되지 않는 코드를 포함하는 익명으로 호스트된 동적 메서드는 항상 예외를 throw합니다. 완전히 신뢰할 수 있는 코드에서 만들고 실행하더라도 확인을 건너뛸 수 없습니다.

확인되지 않는 코드에 대해 throw되는 예외는 동적 메서드가 호출되는 방식에 따라 달라집니다. 메서드에서 CreateDelegate 반환된 대리자를 사용하여 동적 메서드를 호출하면 throw VerificationException 됩니다. 메서드를 사용하여 동적 메서드를 InvokeTargetInvocationException 호출하면 내부 VerificationException메서드가 throw됩니다.