Share via


System.Type.GetType 메서드

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

GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 메서드 오버로드 및 관련 오버로드(GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>)GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean))를 사용하여 메서드의 GetType 기본 구현을 보다 유연한 구현으로 바꿉니다. 형식 이름과 형식을 포함하는 어셈블리의 이름을 확인하는 고유한 메서드를 제공하여 다음을 수행할 수 있습니다.

  • 형식이 로드되는 어셈블리의 버전을 제어합니다.
  • 어셈블리 이름을 포함하지 않는 형식 이름을 찾을 다른 위치를 제공합니다.
  • 부분 어셈블리 이름을 사용하여 어셈블리를 로드합니다.
  • CLR(공용 언어 런타임)에서 생성되지 않은 하위 클래스 System.Type 를 반환합니다.

예를 들어 버전 허용 직렬화에서 이 메서드를 사용하면 부분 이름을 사용하여 "최적" 어셈블리를 검색할 수 있습니다. 메서드의 GetType 다른 오버로드에는 버전 번호를 포함하는 어셈블리 정규화된 형식 이름이 필요합니다.

형식 시스템의 대체 구현은 CLR에서 생성되지 않은 서브클래스를 System.Type 반환해야 할 수 있습니다. 메서드의 GetType 다른 오버로드에서 반환되는 모든 형식은 런타임 형식입니다.

사용법 참고 사항

이 메서드 오버로드 및 연결된 오버로드는 형식의 이름과 어셈블리 이름으로 구문 분석 typeName 한 다음 이름을 확인합니다. 어셈블리의 컨텍스트에서 형식 이름을 확인해야 하므로 형식 이름을 확인하기 전에 어셈블리 이름 확인이 수행됩니다.

참고 항목

어셈블리 정규화된 형식 이름의 개념에 익숙하지 않은 경우 속성을 참조하세요 AssemblyQualifiedName .

typeName 어셈블리 정규화된 이름이 아니면 어셈블리 확인을 건너뜁습니다. 정규화되지 않은 형식 이름은 mscorlib.dll/System.Private.CoreLib.dll 또는 현재 실행 중인 어셈블리의 컨텍스트에서 확인하거나 필요에 따라 매개 변수에 typeResolver 어셈블리를 제공할 수 있습니다. 다양한 종류의 이름 확인에 대한 어셈블리 이름을 포함하거나 생략하면 혼합 이름 확인 섹션에 테이블로 표시됩니다.

일반 사용 현황 정보:

  • 메서드를 assemblyResolvertypeResolver 알 수 없거나 신뢰할 수 없는 호출자에게 전달하지 마세요. 제공하는 메서드 또는 친숙한 메서드만 사용합니다.

    주의

    알 수 없거나 신뢰할 수 없는 호출자의 메서드를 사용하면 악성 코드에 대한 권한 상승이 발생할 수 있습니다.

  • 및/또는 typeResolver 매개 변수를 assemblyResolver 생략하면 매개 변수 값 throwOnError 이 기본 해상도를 수행하는 메서드에 전달됩니다.

  • 이 경우 throwOnError 이 메서드는 truewhen typeResolver 반환 및 when assemblyResolver 반환nullFileNotFoundException throw합니다 TypeLoadExceptionnull.

  • 이 메서드는 throw assemblyResolver 된 예외를 catch하지 않습니다.typeResolver 해결 프로그램 메서드에 의해 throw되는 모든 예외에 대한 책임이 있습니다.

어셈블리 확인

메서드는 assemblyResolver 포함된 문자열 어셈블리 이름을 구문 분석하여 생성되는 개체를 받 AssemblyName 습니다 typeName. 어셈블리 이름이 assemblyResolver 없는 경우 typeName 호출 null 되지 않고 전달됩니다typeResolver.

assemblyResolver 제공되지 않으면 표준 어셈블리 검색을 사용하여 어셈블리를 찾습니다. 제공된 경우 assemblyResolver 메서드는 GetType 표준 검색을 수행하지 않습니다. 이 경우 전달한 모든 어셈블리를 처리할 수 있는지 확인해야 assemblyResolver 합니다.

assemblyResolver 어셈블리를 확인할 수 없는 경우 메서드가 반환 null 되어야 합니다. 반환null되는 경우 assemblyResolver 호출 typeResolver 되지 않고 추가 처리가 발생하지 않습니다. 또한 이 경우 throwOnErrortruethrow FileNotFoundException 됩니다.

AssemblyName 전달되는 assemblyResolver 부분이 부분 이름인 경우 해당 부분 중 하나 이상이 있습니다null. 예를 들어 버전이 없는 경우 속성은 Version .입니다 null. Version 속성, CultureInfo 속성 및 메서드가 GetPublicKeyToken 모두 반환null되면 어셈블리의 단순 이름만 제공되었습니다. 메서드는 assemblyResolver 어셈블리 이름의 모든 부분을 사용하거나 무시할 수 있습니다.

다양한 어셈블리 확인 옵션의 효과는 단순 및 어셈블리 정규화된 형식 이름에 대한 혼합 이름 확인 섹션에 테이블로 표시됩니다.

형식 확인

typeName 어셈블리 이름을 typeResolver 지정하지 않으면 항상 호출됩니다. 어셈블리 이름을 지정하는 경우 typeName 어셈블리 이름이 typeResolver 성공적으로 확인된 경우에만 호출됩니다. 표준 어셈블리 검색이 반환 nulltypeResolver 되는 경우 assemblyResolver 호출되지 않습니다.

메서드는 typeResolver 세 가지 인수를 받습니다.

  • 검색할 어셈블리이거나 null 어셈블리 이름이 없는 경우 typeName
  • 형식의 단순 이름입니다. 중첩된 형식의 경우 가장 바깥쪽에 포함된 형식입니다. 제네릭 형식의 경우 제네릭 형식의 단순 이름입니다.
  • 형식 이름의 대/소문자를 무시해야 하는 true 경우의 부울 값입니다.

구현은 이러한 인수를 사용하는 방법을 결정합니다. 형식을 typeResolver 확인할 수 없는 경우 메서드가 반환 null 되어야 합니다. 반환되고 있는 경우 typeResolver 이 오버로드는 GetType .를 TypeLoadExceptionthrowtrue합니다.throwOnErrornull

다양한 형식 확인 옵션의 효과는 단순 및 어셈블리 정규화된 형식 이름에 대한 혼합 이름 확인 섹션의 테이블로 표시됩니다.

중첩 형식 확인

중첩 형식인 경우 typeName 가장 바깥쪽에 포함된 형식의 이름만 에 전달됩니다 typeResolver. typeResolver 이 형식을 반환하면 가장 안쪽에 GetNestedType 중첩된 형식이 확인될 때까지 메서드가 재귀적으로 호출됩니다.

제네릭 형식 확인

GetType 네릭 형식을 확인하기 위해 재귀적으로 호출됩니다. 먼저 제네릭 형식 자체를 확인하고 해당 형식 인수를 확인합니다. 형식 인수가 제네릭 GetType 인 경우 형식 인수를 확인하기 위해 재귀적으로 호출됩니다.

사용자가 제공하는 조합 assemblyResolvertypeResolver 은 이 재귀의 모든 수준을 해결할 수 있어야 합니다. 예를 들어 .assemblyResolverMyAssembly 제네릭 형식 Dictionary<string, MyType> (Dictionary(Of String, MyType) Visual Basic)을 확인하려는 경우를 가정해 보겠습니다. 다음 제네릭 형식 이름을 전달할 수 있습니다.

"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"

MyType 유일한 어셈블리 정규화된 형식 인수입니다. 및 String 클래스의 Dictionary<TKey,TValue> 이름은 어셈블리로 한정되지 않습니다. typeResolver 어셈블리 또는 null어셈블리가 수신 nullDictionary<TKey,TValue> 되므로 String어셈블리를 처리할 수 있어야 합니다. 정규화되지 않은 형식 이름이 모두 mscorlib.dll/System.Private.CoreLib.dll 있으므로 문자열을 사용하는 메서드의 오버로드 GetType 를 호출하여 이 경우를 처리할 수 있습니다.

Type t = Type.GetType(test,
                      (aName) => aName.Name == "MyAssembly" ?
                          Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : null,
                      (assem, name, ignore) => assem == null ?
                          Type.GetType(name, false, ignore) :
                              assem.GetType(name, false, ignore)
                     );
let t =
    Type.GetType(test,
        (fun aName ->
            if aName.Name = "MyAssembly" then
                Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
            else null),
        fun assem name ignr ->
            if assem = null then
                Type.GetType(name, false, ignr)
            else
                assem.GetType(name, false, ignr))

assemblyResolver 이러한 형식 이름은 어셈블리로 한정되지 않으므로 사전 형식 및 문자열 형식에 대해 메서드가 호출되지 않습니다.

이제 첫 번째 제네릭 인수 형식이 다음System.String에서 시작한다고 YourTypeYourAssembly가정합니다.

"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"

이 어셈블리는 mscorlib.dll/System.Private.CoreLib.dll 또는 현재 실행 중인 어셈블리가 아니므로 어셈블리 정규화된 이름 없이는 확인할 YourType 수 없습니다. assemblyResolve 재귀적으로 호출되므로 이 경우를 처리할 수 있어야 합니다. 이제 어셈블리가 아닌 MyAssembly다른 어셈블리에 대해 반환하는 null 대신 제공된 AssemblyName 개체를 사용하여 어셈블리 로드를 수행합니다.

Type t2 = Type.GetType(test,
                       (aName) => aName.Name == "MyAssembly" ?
                           Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") :
                           Assembly.Load(aName),
                       (assem, name, ignore) => assem == null ?
                           Type.GetType(name, false, ignore) :
                               assem.GetType(name, false, ignore), true
                      );
let t2 =
    Type.GetType(test,
        (fun aName ->
            if aName.Name = "MyAssembly" then
                Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
            else Assembly.Load aName),
        (fun assem name ignr ->
            if assem = null then
                Type.GetType(name, false, ignr)
            else
                assem.GetType(name, false, ignr)), true)

특수 문자를 사용하여 형식 이름 확인

특정 문자는 어셈블리로 한정된 이름에 특별한 의미를 갖습니다. 단순 형식 이름에 이러한 문자가 포함된 경우 단순 이름이 어셈블리 정규화된 이름의 일부일 때 문자 구문 분석 오류가 발생합니다. 구문 분석 오류를 방지하려면 어셈블리 정규화된 이름을 메서드에 전달하기 전에 백슬래시로 특수 문자를 이스케이프해야 GetType 합니다. 예를 들어 형식의 이름이 지정 Strange]Type되면 다음과 Strange\]Type같이 대괄호 앞에 이스케이프 문자를 추가해야 합니다.

참고 항목

이러한 특수 문자를 가진 이름은 Visual Basic 또는 C#에서 만들 수 없지만 CIL(공용 중간 언어)을 사용하거나 동적 어셈블리를 내보내서 만들 수 있습니다.

다음 표에는 형식 이름의 특수 문자가 표시됩니다.

문자 의미
, (쉼표) 어셈블리로 한정된 이름의 구분 기호입니다.
[] (대괄호) 접미사 쌍으로 배열 형식을 나타냅니다. 구분 기호 쌍으로 제네릭 인수 목록과 어셈블리 정규화된 이름을 묶습니다.
&(앰퍼샌드) 접미사로 형식이 참조 형식임을 나타냅니다.
* (별표) 접미사로 형식이 포인터 형식임을 나타냅니다.
+ (더하기) 중첩된 형식의 구분 기호입니다.
\ (백슬래시) 이스케이프 문자입니다.

올바르게 이스케이프된 문자열 반환과 같은 AssemblyQualifiedName 속성입니다. 메서드에 올바르게 이스케이프된 문자열을 GetType 전달해야 합니다. 이 메서드는 GetType 이스케이프된 이름을 기본 형식 확인 메서드와 typeResolver 올바르게 전달합니다. 이름을 이스케이프되지 않은 이름과 typeResolver비교해야 하는 경우 이스케이프 문자를 제거해야 합니다.

혼합 이름 확인

다음 표에서는 형식 이름과 어셈블리 이름의 모든 조합에 대해 , typeResolver및 기본 이름 확인 간의 assemblyResolver상호 작용을 typeName요약합니다.

형식 이름의 내용 어셈블리 확인자 메서드 형식 확인자 메서드 결과
type, assembly null null 메서드 오버로드를 호출하는 Type.GetType(String, Boolean, Boolean) 것과 같습니다.
type, assembly 제공 null assemblyResolver 는 어셈블리를 반환하거나 어셈블리를 확인할 수 없는 경우 반환 null 합니다. 어셈블리가 확인 Assembly.GetType(String, Boolean, Boolean) 되면 메서드 오버로드를 사용하여 어셈블리에서 형식을 로드하고, 그렇지 않으면 형식을 확인하려고 시도하지 않습니다.
type, assembly null 제공 어셈블리 이름을 AssemblyName 개체로 변환하고 메서드 오버로드를 Assembly.Load(AssemblyName) 호출하여 어셈블리를 가져오는 것과 같습니다. 어셈블리가 확인되면 어셈블리가 전달되고 typeResolver, typeResolver 그렇지 않으면 호출되지 않으며 형식을 더 이상 확인하려고 시도하지 않습니다.
type, assembly 제공 제공 assemblyResolver 는 어셈블리를 반환하거나 어셈블리를 확인할 수 없는 경우 반환 null 합니다. 어셈블리가 확인되면 어셈블리가 전달되고 typeResolver, typeResolver 그렇지 않으면 호출되지 않으며 형식을 더 이상 확인하려고 시도하지 않습니다.
type null, 제공됨 null 메서드 오버로드를 호출하는 Type.GetType(String, Boolean, Boolean) 것과 같습니다. 어셈블리 이름이 제공되지 않으므로 mscorlib.dll/System.Private.CoreLib.dll 현재 실행 중인 어셈블리만 검색됩니다. 제공된 경우 assemblyResolver 무시됩니다.
type null, 제공됨 제공 typeResolver 가 호출되고 null 어셈블리에 전달됩니다. typeResolver 는 용도에 맞게 로드되는 어셈블리를 포함하여 모든 어셈블리에서 형식을 제공할 수 있습니다. 제공된 경우 assemblyResolver 무시됩니다.
assembly null, 제공됨 null, 제공됨 어셈블리 이름이 어셈블리 정규화된 형식 이름인 것처럼 구문 분석되므로 A FileLoadException 가 throw됩니다. 이로 인해 어셈블리 이름이 잘못되었습니다.