.dll 동적 로드(Dynamic load)
프로그래밍/02.C#고급 / 2011. 10. 24. 23:12

정말 오랜만에 윈폼(WinForm)프로젝트를 진행을 했다. 프로젝트 컨셉상 .dll 동적 로드(Dynamic load)해서 사용하기로 했다. .dll로드는 여러므로 사용될 수 있으므로, 간단하게 정리하려 한다.
.dll 동적로드는 간단히 설명하면, 프로젝트에 참조하는 .dll이 아니라 외부에서 dll를 받아 동적으로 로드해 사용하고자하는 인스턴스(Instance)를 생성해 사용할수 있는 것을 말하는데, 이름에서 예상했듯이 그냥 예상한 그대로이다.
- /// <summary>
- /// 해당 어셈블리를 로드해서 파라미터 타입을 찾아 인스턴스 생성후 반환합니다.
- /// </summary>
- /// <param name="interfaceType">인스턴스 생성 타입</param>
- /// <returns>인스턴스</returns>
- public object LoadAssembly(Type interfaceType)
- {
- // 해당 Type을 확인해서 .dll 경로를 반환합니다.
- string filePath = GetAssemblyPath(interfaceType);
- if(string.IsNullOrEmpty(filePath))
- return null;
- // filePath는 로드하려는 .dll의 경로를 말하며, Assembly 객체의 인스턴스를 생성합니다.
- Assembly asm = Assembly.LoadFrom(filePath);
- object result = null;
- // 제대로 로드가 되었는지 확인 합니다.
- if (asm != null)
- {
- // 어셈블리에 로드된 Type 리스트를 반환합니다.
- Type[] types = asm.GetExportedTypes();
- // Type 리스트를 돌면서 하나하나 내가 원하는, 즉 내가 사용하려는 객체가 있는지 확인 합니다.
- foreach (Type t in types)
- {
- // interfaceType는 내가 찾고자하는 객체이다. (interfaceType는 Type이다.)
- // IsAssignableFrom 메소드를 이용하여 해당 타입으로 인스턴스로 생성할수 있는지 확인한다.
- if (interfaceType.IsAssignableFrom(t))
- {
- // result는 Object로써 Activator.CreateInstance를 이용하여 인스턴스를 생성합니다.
- result = Activator.CreateInstance(t);
- if (result != null)
- break;
- }
- }
- }
- return result;
- }
위 소스에 대한 설명은 따로 할 필요가 없을 듯 하다. 주석에 잘 쓰여 있으니 말이다. 그리고 GetAssemblyPath 메소드에 대한 내용을 다루지 않은 것은 그냥 파일 경로를 반환해주는 역활만 하는 것이므로, 따로 적어 두지 않았다. 그러나 샘플 프로젝트를 첨부했으니 이를 확인하면 될 것이다.
첨부 프로젝트의 컨셉은 아래 그림과 같다.
(주의: 빌드 전에 확인 해야할 사항이 있는데, happydong.DLLLoader 프로젝트 안에 DLLPaths.resx파일이 있을 것이다. 그 곳에 .dll 경로가 지정되어 있는데, 이 곳을 실제 .dll 경로로 적절히 수정해서 빌드하면 될 것이다. 지금은 F드라이브로 되어 있는데, 적절히 수정해야 한다. )