다음을 통해 공유


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 알 수 없거나 신뢰할 수 없는 호출자에게 전달하지 마세요. 사용자가 제공하거나 익숙한 메서드만 사용합니다.

    주의

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

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

  • throwOnErrortrue인 경우, TypeLoadExceptiontypeResolver을 반환하면 null을 throw하고, FileNotFoundExceptionassemblyResolver을 반환하면 null을 throw합니다.

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

어셈블리 해결

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

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

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

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

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

유형 해결

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

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

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

구현은 이러한 인수를 사용하는 방법을 결정합니다. 형식을 typeResolver 해결할 수 없는 경우 메서드는 null을 반환해야 합니다. typeResolvernull을 반환하고 throwOnErrortrue일 경우, 이 GetType 오버로드는 TypeLoadException를 발생시킵니다.

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

중첩 형식 해결

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

제네릭 형식 해결

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

사용자가 제공하는 조합 assemblyResolvertypeResolver 은 이 재귀의 모든 수준을 해결할 수 있어야 합니다. 예를 들어, assemblyResolver를 제공하여 MyAssembly의 로딩을 제어한다고 가정해 보십시오. 제네릭 형식 Dictionary<string, MyType>(Visual Basic에서 Dictionary(Of String, MyType))을 해결하려고 가정해 보겠습니다. 다음 제네릭 형식 이름을 전달할 수 있습니다.

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

MyType 유일한 어셈블리 정규화된 형식 인수입니다. 클래스 Dictionary<TKey,TValue>String의 이름은 어셈블리로 한정되지 않았습니다. 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 대신에, 첫 번째 제네릭 인수 형식이 YourType이며, 이것이 YourAssembly로부터 온다고 가정해 봅시다.

"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 재귀적으로 호출되므로 이 경우를 처리할 수 있어야 합니다. 이제 null 이외의 다른 어셈블리에 대해 MyAssembly을 반환하는 대신 제공된 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비교해야 하는 경우 이스케이프 문자를 제거해야 합니다.

혼합 이름 확인

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

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