System.Reflection.Emit.TypeBuilder 클래스

비고

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

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

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

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

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

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

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

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

특성

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

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

알려진 문제

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