C# 스터디
Type.GetType() 호출에서의 실수

[제목] Type.GetType() 호출에서의 실수

Type.GetType() 메서드는 .NET 어셈블리의 특정 클래스를 사용할 수 있도록 해당 클래스 Type명을 문자열로 받아들여 Type객체를 리턴한다. 동일한 클래스가 여러 DLL에 존재할 수 있으므로, GetType()에 쓰이는 파라미터는 네임스페이스.클래스, 어셈블리명, 버젼, Culture, PublicKeyToken 등 여러정보를 사용하여 (이를 AssemblyQualifiedName 이라 부른다) 특정 어셈블리의 클래스 타입을 지정하게 된다.


예를 들어, 다음과 같은 간단한 클래스가 ClassLibrary1.dll 에 있다고 가정하자.
namespace ClassLib
{
    public class MyClass
    {
        public string Name { get; set; }
    }
}

이 DLL의 MyClass 타입을 얻기 위해, 다른 EXE 프로그램에서 다음과 같이 코딩하였다. Type명은 (경우에 따라) Full Type명 혹은 Partial Type명으로 지정할 수 있다. Type명의 처음은 네임스페이스.클래스명을 쓰고, 다음은 어셈블리명 즉 DLL명을 .dll 없이 적는다.
//string fullTypename = "ClassLib.MyClass, ClassLibrary1, Version=1.0.0.0, Culture=neutral, PulbicKeyToken=null";

string partialTypeName = "ClassLib.MyClass , ClassLibrary1";
Type appType = Type.GetType(partialTypeName);
if (appType != null)
{
    Debug.WriteLine(appType.AssemblyQualifiedName);
    object obj = Activator.CreateInstance(appType, null);                
    return obj;
}
else
{
    Console.WriteLine("Error: appType is null");
}

그런데, 이를 실행하면 의도된 바와 다르게 변수 appType은 null을 리턴한다. 프로그램 로직상 아무 문제가 없는 프로그램이다. 사실 이러한 종류의 에러는 개발자가 쓸데없이 많은 시간을 소모하게 한다. 나중에 알게되면 아주 사소한 문제이긴 하지만...
아뭏든 이 코딩의 실수는 "ClassLib.MyClass , ClassLibrary1"; 에서 MyClass 뒤에 공백(SPACE)를 하나 주었다는 것이다. AssemblyQualifiedName은 대소문자를 구별하고, 각 엔트리를 구별하는 콤마 앞에는 SPACE를 쓰지 못하게 하는 등 까다로운 규칙을 가지고 있다. 재미있는 것은 콤마 앞에는 SPACE를 쓰지 못하지만 콤마 뒤에는 쓸 수 있다 :-)


본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.