문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문

TypeBuilder.CreateType 메서드

해당 클래스에 대한 Type 개체를 만듭니다. 클래스의 필드 및 메서드를 정의한 후에 CreateType을 호출하여 해당 클래스의 Type 개체를 로드합니다.

네임스페이스:  System.Reflection.Emit
어셈블리:  mscorlib(mscorlib.dll)

[SecuritySafeCriticalAttribute]
public Type CreateType()

반환 값

형식: System.Type
이 클래스의 새 개체입니다.

예외상황
InvalidOperationException

포함하는 형식이 만들어지지 않은 경우

- 또는 -

이 형식이 비추상 형식이고 추상 메서드가 포함된 경우

- 또는 -

이 형식이 추상 클래스 또는 인터페이스가 아니고 메서드 본문이 없는 메서드가 들어 있는 경우

NotSupportedException

형식에 잘못된 MSIL(Microsoft Intermediate Language) 코드가 들어 있는 경우

- 또는 -

분기 대상을 1바이트 오프셋으로 지정했지만 분기 대상이 분기에서 128바이트 이상 떨어져 있는 경우

TypeLoadException

형식을 로드할 수 없는 경우. 호출 규칙 HasThis가 있는 static 메서드가 포함되어 있거나 아직 만들어지지 않은 중첩 형식을 사용하는 필드가 있는 경우를 예로 들 수 있습니다.

현재 형식이 완성되지 않은 형식에서 파생되었거나 불완전한 인터페이스를 구현하는 경우, 현재 형식에서 CreateType 메서드를 호출하려면 먼저 부모 형식 및 인터페이스 형식에서 이 메서드를 호출해야 합니다.

중첩 형식으로 정의된 열거형 필드와 같이 중첩 형식으로 정의된 값 형식 필드가 바깥쪽 형식에 포함되어 있는 경우, 바깥쪽 형식에서 CreateType 메서드를 호출하면 TypeLoadException이 throw됩니다. 중첩 형식이 완성되기 전까지는 로더에서 바깥쪽 형식의 크기를 확인할 수 없기 때문입니다. 호출자는 먼저 중첩 형식을 나타내는 TypeBuilder 개체에서 CreateType을 호출하여 중첩 형식을 만들어야 합니다. 이 항목의 예제에서는 이러한 동작을 보여 줍니다.

CreateType 메서드 호출 횟수에 관계없이 형식은 한 번만 만들어집니다. 즉, 모든 호출에서 동일한 Type 개체를 반환합니다.

다음 예제에서는 AnEnum 형식의 필드가 있으므로 해당 중첩 열거형 형식 AnEnum을 사용하는 AType 형식을 정의하는 방법을 보여 줍니다. CreateType 메서드는 바깥쪽 형식에서 호출되기 전에 먼저 중첩 형식에서 호출됩니다.

참고참고:

이 예제를 실행하려면 Demo 메서드 및 TextBlock 컨트롤을 사용하는 예제 빌드를 참조하십시오.


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

internal class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      AssemblyName asmName = new AssemblyName("DynamicAssembly");
      AssemblyBuilder ab = 
         AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, 
            AssemblyBuilderAccess.Run);
      ModuleBuilder mb = ab.DefineDynamicModule("DynamicModule");

      // Define a type named "AType", and a nested enumeration "AnEnum". The 
      // enumeration has one field, "EnumField1", with a value of 1.
      TypeBuilder tb = mb.DefineType("AType", TypeAttributes.Public);
      TypeBuilder eb = tb.DefineNestedType("AnEnum", 
         TypeAttributes.NestedPublic | TypeAttributes.Sealed, 
         typeof(Enum));
      eb.DefineField("value__", typeof(int), 
         FieldAttributes.Private | FieldAttributes.SpecialName);
      FieldBuilder fb = eb.DefineField("EnumField1", eb, 
         FieldAttributes.Public | FieldAttributes.Literal | FieldAttributes.Static);
      fb.SetConstant(1);

      // Defining this field creates a dependency between AType and its nested type,
      // AnEnum. Because this field is of type AnEnum, the loader cannot determine its 
      // size until the type AnEnum has been created. Therefore, the creation of type 
      // AType depends on the creation of its nested type, AnEnum.
      tb.DefineField("MyField", eb, FieldAttributes.Public);

      try
      {
         // First create the inner (nested) type, then create the outer (nesting)
         // type. If you comment out the following line, a TypeLoadException is thrown
         // when the outer type is created, because the type loader does not know the
         // size of the field "MyField". 
         Type tNested = eb.CreateType();

         Type tNesting = tb.CreateType();

         outputBlock.Text += 
            String.Format("The declaring type of {0} is {1}.\n", tNested, tNesting);

      }
      catch(Exception ex)
      {
         outputBlock.Text += ex.GetType().Name + ": " + ex.Message;
      }
   }
}

/* This example produces output similar to the following:

The declaring type of AType+AnEnum is AType.
 */


Silverlight

5, 4, 3에서 지원

Silverlight에서 지원되는 운영 체제 및 브라우저에 대한 자세한 내용은 지원되는 운영 체제 및 브라우저을 참조하십시오.

커뮤니티 추가 항목

추가
표시: