System.Reflection.Emit.TypeBuilder 클래스

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

TypeBuilder 는 런타임에서 동적 클래스 생성을 제어하는 데 사용되는 루트 클래스입니다. 클래스를 정의하고, 메서드와 필드를 추가하고, 모듈 내에 클래스를 만드는 데 사용되는 루틴 집합을 제공합니다. 개체를 반환하는 메서드를 호출 ModuleBuilder.DefineType 하여 동적 모듈에서 새 TypeBuilder 메서드를 TypeBuilder 만들 수 있습니다.

리플렉션 내보내기에서는 형식을 정의하기 위한 다음 옵션을 제공합니다.

  • 지정된 이름을 사용하여 클래스 또는 인터페이스를 정의합니다.
  • 지정된 이름과 특성을 사용하여 클래스 또는 인터페이스를 정의합니다.
  • 지정된 이름, 특성 및 기본 클래스를 사용하여 클래스를 정의합니다.
  • 지정된 이름, 특성, 기본 클래스 및 클래스가 구현하는 인터페이스 집합을 사용하여 클래스를 정의합니다.
  • 지정된 이름, 특성, 기본 클래스 및 압축 크기를 사용하여 클래스를 정의합니다.
  • 지정된 이름, 특성, 기본 클래스 및 클래스 크기를 전체적으로 사용하여 클래스를 정의합니다.
  • 지정된 이름, 특성, 기본 클래스, 압축 크기 및 클래스 크기를 전체적으로 사용하여 클래스를 정의합니다.

개체가 나타내는 TypeBuilder 불완전한 형식에 대한 배열 형식, 포인터 형식 또는 바이리프 형식을 만들려면 메서드, MakePointerType 메서드 또는 MakeByRefType 메서드를 각각 사용합니다MakeArrayType.

형식을 사용하려면 먼저 메서드를 TypeBuilder.CreateType 호출해야 합니다. CreateType 은 형식 만들기를 완료합니다. CreateType호출한 후 호출자는 메서드를 사용하여 Activator.CreateInstance 형식을 인스턴스화하고 메서드를 사용하여 Type.InvokeMember 형식의 멤버를 호출할 수 있습니다. CreateType이 호출된 후 형식의 구현을 변경하는 메서드를 호출하는 것은 오류입니다. 예를 들어 공용 언어 런타임은 호출자가 형식에 새 멤버를 추가하려고 하면 예외를 throw합니다.

클래스 이니셜라이저는 메서드를 TypeBuilder.DefineTypeInitializer 사용하여 만들어집니다. DefineTypeInitializer 는 개체를 ConstructorBuilder 반환합니다.

중첩 형식은 메서드 중 하나를 호출하여 정의됩니다 TypeBuilder.DefineNestedType .

특성

클래스는 TypeBuilder 열거형을 TypeAttributes 사용하여 만들 형식의 특성을 추가로 지정합니다.

  • 인터페이스는 및 TypeAttributes.Abstract 특성을 사용하여 TypeAttributes.Interface 지정됩니다.
  • 구체적인 클래스(확장할 수 없는 클래스)는 특성을 사용하여 TypeAttributes.Sealed 지정됩니다.
  • 몇 가지 특성은 형식 표시 여부를 결정합니다. 열거형에 대한 TypeAttributes 설명을 참조하세요.
  • 지정된 경우 TypeAttributes.SequentialLayout 클래스 로더는 메타데이터에서 읽는 순서대로 필드를 배치합니다. 클래스 로더는 지정된 압축 크기를 고려하지만 지정된 필드 오프셋은 무시합니다. 메타데이터는 필드 정의가 내보내는 순서를 유지합니다. 병합을 통해서도 메타데이터는 필드 정의의 순서를 다시 지정하지 않습니다. 로더는 지정된 필드 오프셋을 지정한 경우에만 TypeAttributes.ExplicitLayout 적용합니다.

알려진 문제

  • 리플렉션 내보내기가 인터페이스를 구현하는 비추상 클래스가 인터페이스에 선언된 모든 메서드를 구현했는지 여부를 확인하지 않습니다. 그러나 클래스가 인터페이스에 선언된 모든 메서드를 구현하지 않는 경우 런타임은 클래스를 로드하지 않습니다.
  • TypeBuilder 파생되지만 Type클래스에 Type 정의된 추상 메서드 중 일부는 클래스에서 TypeBuilder 완전히 구현되지 않습니다. 이러한 TypeBuilder 메서드에 대한 호출은 예외를 throw합니다 NotSupportedException . 원하는 기능은 만든 형식을 검색 Type.GetType 하거나 Assembly.GetType 검색된 형식에 반영하여 가져올 수 있습니다.