<유형> 요소(.NET 네이티브)

클래스 또는 구조체와 같은 특정 형식에 런타임 정책을 적용합니다.

구문

<Type Name="type_name"
      Activate="policy_type"
      Browse="policy_type"
      Dynamic="policy_type"
      Serialize="policy_type"
      DataContractSerializer="policy_setting"
      DataContractJsonSerializer="policy_setting"
      XmlSerializer="policy_setting"
      MarshalObject="policy_setting"
      MarshalDelegate="policy_setting"
      MarshalStructure="policy_setting" />

특성 및 요소

다음 단원에서는 특성, 자식 요소 및 부모 요소에 대해 설명합니다.

특성

Attribute 특성 유형 설명
Name 일반 필수 특성입니다. 형식 이름을 지정합니다.
Activate 반영 선택적 특성입니다. 인스턴스를 활성화할 수 있도록 생성자에 대한 런타임 액세스를 제어합니다.
Browse 반영 선택적 특성입니다. 프로그램 요소에 대한 정보 쿼리를 제어하지만 런타임 액세스를 사용하도록 설정하지는 않습니다.
Dynamic 반영 선택적 특성입니다. 동적 프로그래밍을 수행할 수 있도록 생성자, 메서드, 필드, 속성 및 이벤트를 비롯한 모든 형식 멤버에 대한 런타임 액세스를 제어합니다.
Serialize 직렬화 선택적 특성입니다. Newtonsoft JSON 직렬 변환기 등의 라이브러리를 통해 형식 인스턴스를 직렬화 및 역직렬화할 수 있도록 생성자, 필드 및 속성에 대한 런타임 액세스를 제어합니다.
DataContractSerializer 직렬화 선택적 특성입니다. System.Runtime.Serialization.DataContractSerializer 클래스를 사용하는 serialization에 대한 정책을 제어합니다.
DataContractJsonSerializer 직렬화 선택적 특성입니다. System.Runtime.Serialization.Json.DataContractJsonSerializer 클래스를 사용하는 JSON serialization에 대한 정책을 제어합니다.
XmlSerializer 직렬화 선택적 특성입니다. System.Xml.Serialization.XmlSerializer 클래스를 사용하는 XML serialization에 대한 정책을 제어합니다.
MarshalObject Interop 선택적 특성입니다. Windows 런타임 및 COM에 대한 참조 형식을 마샬링하는 정책을 제어합니다.
MarshalDelegate Interop 선택적 특성입니다. 네이티브 코드에 대한 함수 포인터로 대리자 형식을 마샬링하는 정책을 제어합니다.
MarshalStructure Interop 선택적 특성입니다. 값 형식을 네이티브 코드로 마샬링하는 정책을 제어합니다.

Name 특성

설명
type_name 형식 이름입니다. 이 <Type> 요소가 <Namespace> 요소 또는 다른 <Type> 요소의 자식인 경우 type_name은 네임스페이스가 없는 형식 이름을 포함할 수 있습니다. 그러지 않으면 type_name은 정규화된 형식 이름을 포함해야 합니다.

기타 모든 특성

설명
policy_setting 이 정책 형식에 적용할 설정입니다. 가능한 값은 All, Auto, Excluded, Public, PublicAndInternal, Required Public, Required PublicAndInternalRequired All입니다. 자세한 내용은 런타임 지시문 정책 설정을 참조하세요.

자식 요소

요소 설명
<AttributeImplies> 포함 형식이 특성이면 해당 특성이 적용되는 코드 요소에 대해 런타임 정책을 정의합니다.
<이벤트> 이 형식에 속하는 이벤트에 리플렉션 정책을 적용합니다.
<필드> 이 형식에 속하는 필드에 리플렉션 정책을 적용합니다.
<GenericParameter> 제네릭 형식의 매개 변수 형식에 정책을 적용합니다.
<ImpliesType> 포함 <Type> 요소가 나타내는 형식에 정책이 적용된 경우 형식에 해당 정책을 적용합니다.
<방법> 이 형식에 속하는 메서드에 리플렉션 정책을 적용합니다.
<MethodInstantiation> 이 형식에 속하는 생성된 제네릭 메서드에 리플렉션 정책을 적용합니다.
<속성> 이 형식에 속하는 속성에 리플렉션 정책을 적용합니다.
<Subtypes> 포함 형식에서 상속된 모든 클래스에 런타임 정책을 적용합니다.
<Type> 중첩된 형식에 리플렉션 정책을 적용합니다.
<TypeInstantiation> 생성된 제네릭 형식에 리플렉션 정책을 적용합니다.

부모 요소

요소 설명
<애플리케이션> 런타임에 해당 메타데이터를 리플렉션에 사용할 수 있는 애플리케이션 수준 형식 및 형식 멤버에 대한 컨테이너로 사용됩니다.
<어셈블리> 지정된 어셈블리의 모든 형식에 리플렉션 정책을 적용합니다.
<라이브러리> 런타임에 해당 메타데이터를 리플렉션에 사용할 수 있는 형식 및 형식 멤버가 포함된 어셈블리를 정의합니다.
<네임스페이스> 네임스페이스의 모든 형식에 리플렉션 정책을 적용합니다.
<Type> 형식 및 모든 해당 멤버에 리플렉션 정책을 적용합니다.
<TypeInstantiation> 생성된 제네릭 형식 및 모든 해당 멤버에 리플렉션 정책을 적용합니다.

설명

리플렉션, serialization 및 interop 특성은 모두 선택 사항입니다. 이러한 특성이 없으면 <Type> 요소는 하위 형식이 개별 멤버의 정책을 정의하는 컨테이너로 사용됩니다.

<Type> 요소는 <Assembly>, <Namespace>, <Type> 또는 <TypeInstantiation> 요소의 자식인 경우 부모 요소가 정의하는 정책 설정을 재정의합니다.

제네릭 형식의 <Type> 요소는 자체 정책이 없는 모든 인스턴스화에 해당 정책을 적용합니다. 생성된 제네릭 형식의 정책은 <TypeInstantiation> 요소에 의해 정의됩니다.

제네릭 형식의 경우 해당 이름은 억음 악센트 기호(`)와 제네릭 매개 변수의 수가 차례로 붙는 형식으로 데코레이팅됩니다. 예를 들어 Name 클래스 <Type> 요소의 System.Collections.Generic.List<T> 특성은 Name="System.Collections.Generic.List`1"로 표시됩니다.

예 1

다음 예제에서는 리플렉션을 사용하여 System.Collections.Generic.List<T> 클래스의 필드, 속성 및 메서드에 대한 정보를 표시합니다. 예제에서 b 변수는 TextBlock 컨트롤입니다. 이 예제에서는 형식 정보만 검색하므로 메타데이터 사용 가능 여부는 Browse 정책 설정에 의해 제어됩니다.

public static void GetReflectionInfo()
{
   Type t = typeof(List<>);
   b.Text += String.Format("Type information for {0}\n", t);

   // Get fields.
   b.Text += "\nFields:\n";

   var fields = t.GetTypeInfo().DeclaredFields;
   int nFields = 0;
   foreach (var field in fields)
   {
      b.Text += String.Format("   {0} ({1})", field.Name, field.FieldType.Name);
      nFields++;
   }
   if (nFields == 0) b.Text += "   None\n";

   // Get properties.
   b.Text += "\nProperties:\n";
   var props = t.GetTypeInfo().DeclaredProperties;
   int nProps = 0;
   foreach (var prop in props)
   {
      b.Text += String.Format("   {0} ({1})\n", prop.Name, prop.PropertyType.Name);
      nProps++;
   }
   if (nProps == 0) b.Text += "   None\n";

   // Get methods.
   b.Text += "\nMethods:\n";
   var methods = t.GetTypeInfo().DeclaredMethods;
   int nMethods = 0;
   foreach (var method in methods)
   {
      if (method.IsSpecialName) continue;
      b.Text += String.Format("   {0}({1}) ({2})\n", method.Name,
                              GetSignature(method), method.ReturnType.Name);
      nMethods++;
   }
   if (nMethods == 0) b.Text += "   None\n";
}

private static string GetSignature(MethodInfo m)
{
   string signature = null;
   var parameters = m.GetParameters();
   for (int ctr = 0; ctr < parameters.Length; ctr++)
   {
      signature += String.Format("{0} {1}", parameters[ctr].ParameterType.Name,
                                  parameters[ctr].Name);
      if (ctr < parameters.Length - 1) signature += ", ";
   }
   return signature;
}

List<T> 클래스에 대한 메타데이터는 .NET 네이티브 도구 체인에 의해 자동으로 포함되지 않으므로 예는 런타임에 요청된 멤버 정보를 표시하지 못합니다. 필요한 메타데이터를 제공하려면 다음 <Type> 요소를 런타임 지시문 파일에 추가합니다. 여기서는 부모 <Namespace> 요소를 제공했으므로 <Type> 요소에 정규화된 형식 이름을 제공하지 않아도 됩니다.

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
   <Application>
      <Assembly Name="*Application*" Dynamic="Required All" />
      <Namespace Name ="System.Collections.Generic" >
        <Type Name="List`1" Browse="Required All" />
     </Namespace>
   </Application>
</Directives>

예제 2

다음 예제에서는 리플렉션을 사용하여 PropertyInfo 속성을 나타내는 String.Chars[] 개체를 검색합니다. 그런 다음 PropertyInfo.GetValue(Object, Object[]) 메서드를 사용하여 문자열에서 7번째 문자의 값을 검색하고 문자열의 모든 문자를 표시합니다. 예제에서 b 변수는 TextBlock 컨트롤입니다.

public void Example()
{
  string test = "abcdefghijklmnopqrstuvwxyz";

  // Get a PropertyInfo object.
  TypeInfo ti = typeof(string).GetTypeInfo();
  PropertyInfo pinfo = ti.GetDeclaredProperty("Chars");

  // Show the seventh letter ('g')
  object[] indexArgs = { 6 };
  object value = pinfo.GetValue(test, indexArgs);
  b.Text += String.Format("Character at position {0}: {1}\n", indexArgs[0], value);

  // Show the complete string.
  b.Text += "\nThe complete string:\n";
  for (int x = 0; x < test.Length; x++)
  {
      b.Text += pinfo.GetValue(test, new Object[] {x}).ToString() + " ";
  }
}
// The example displays the following output:
//       Character at position 6: g
//
//       The complete string:
//       a b c d e f g h i j k l m n o p q r s t u v w x y z

String 개체에 대한 메타데이터를 사용할 수 없기 때문에 PropertyInfo.GetValue(Object, Object[]) 메서드를 호출하면 .NET 네이티브 도구 체인으로 컴파일할 때 런타임에 NullReferenceException 예외가 발생합니다. 예외를 방지하고 필요한 메타데이터를 제공하려면 다음 <Type> 요소를 런타임 지시문 파일에 추가합니다.

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <Assembly Name="*Application*" Dynamic="Required All" />
    <Type Name="System.String" Dynamic="Required Public"/> -->
  </Application>
</Directives>

참고 항목