블로그 이미지
내게 능력 주시는 자 안에서 내가 모든것을 할수 있느니라 - 빌립보서 4 : 13 - happydong

카테고리

Happydong (1363)
프로그래밍 (156)
MUSIC (16)
인물 (3)
Utility (10)
세미나 소식&내용 (22)
IT뉴스 (18)
운동 (830)
CAFE (10)
Life (282)
Total
Today
Yesterday




 정말 오랜만에 윈폼(WinForm)프로젝트를 진행을 했다. 프로젝트 컨셉상 .dll 동적 로드(Dynamic load)해서 사용하기로 했다. .dll로드는 여러므로 사용될 수 있으므로, 간단하게 정리하려 한다.
 .dll 동적로드는 간단히 설명하면, 프로젝트에 참조하는 .dll이 아니라 외부에서 dll를 받아 동적으로 로드해 사용하고자하는 인스턴스(Instance)를 생성해 사용할수 있는 것을 말하는데, 이름에서 예상했듯이 그냥 예상한 그대로이다.

  1. /// <summary>  
  2. /// 해당 어셈블리를 로드해서 파라미터 타입을 찾아 인스턴스 생성후 반환합니다.  
  3. /// </summary>  
  4. /// <param name="interfaceType">인스턴스 생성 타입</param>  
  5. /// <returns>인스턴스</returns>  
  6. public object LoadAssembly(Type interfaceType)  
  7. {  
  8.   
  9.     // 해당 Type을 확인해서 .dll 경로를 반환합니다.  
  10.     string filePath = GetAssemblyPath(interfaceType);  
  11.   
  12.     if(string.IsNullOrEmpty(filePath))  
  13.         return null;  
  14.   
  15.     // filePath는 로드하려는 .dll의 경로를 말하며, Assembly 객체의 인스턴스를 생성합니다.  
  16.     Assembly asm = Assembly.LoadFrom(filePath);  
  17.     object result = null;  
  18.   
  19.     // 제대로 로드가 되었는지 확인 합니다.   
  20.     if (asm != null)  
  21.     {  
  22.         // 어셈블리에 로드된 Type 리스트를 반환합니다.  
  23.         Type[] types = asm.GetExportedTypes();  
  24.   
  25.         // Type 리스트를 돌면서 하나하나 내가 원하는, 즉 내가 사용하려는 객체가 있는지 확인 합니다.  
  26.         foreach (Type t in types)  
  27.         {  
  28.             // interfaceType는 내가 찾고자하는 객체이다. (interfaceType는 Type이다.)  
  29.             // IsAssignableFrom 메소드를 이용하여 해당 타입으로 인스턴스로 생성할수 있는지 확인한다.  
  30.             if (interfaceType.IsAssignableFrom(t))  
  31.             {  
  32.                 // result는 Object로써 Activator.CreateInstance를 이용하여 인스턴스를 생성합니다.  
  33.                 result = Activator.CreateInstance(t);  
  34.                 if (result != null)  
  35.                     break;  
  36.             }  
  37.         }  
  38.     }  
  39.   
  40.     return result;  
  41. }  


위 소스에 대한 설명은 따로 할 필요가 없을 듯 하다. 주석에 잘 쓰여 있으니 말이다. 그리고 GetAssemblyPath 메소드에 대한 내용을 다루지 않은 것은 그냥 파일 경로를 반환해주는 역활만 하는 것이므로, 따로 적어 두지 않았다. 그러나 샘플 프로젝트를 첨부했으니 이를 확인하면 될 것이다.

첨부 프로젝트의 컨셉은 아래 그림과 같다.



(주의: 빌드 전에 확인 해야할 사항이 있는데, happydong.DLLLoader 프로젝트 안에 DLLPaths.resx파일이 있을 것이다. 그 곳에 .dll 경로가 지정되어 있는데, 이 곳을 실제 .dll 경로로 적절히 수정해서 빌드하면 될 것이다. 지금은 F드라이브로 되어 있는데, 적절히 수정해야 한다. )
Posted by happydong
, |