본문 바로가기

Development/C#

Load Assembly in Runtime using AppDomain

Introduction

Application을 개발할때 여러 프로젝트에서 동일한 기능을 공유하거나, 관리상의 목적으로 하여금 DLL 형태로 분리해 개발을 하는 경우가 있습니다. .Net으로 개발된 Application은 참조된 DLL(Assembly)을 로드할때 기본적으로 System32나, Application Root, GAC에 등록되어 있는 DLL을 검색하는데,  검색에 실패할경우 "FileNotFoundException"을 발생시킵니다.
만약, Application에서 참조하는 DLL(Assembly)의 경로가 위에서 언급한 위치와 다른 위치에 설치하고자 한다면 AppDomain을 이용해 런타임에 직접 Assembly를 Load하는 방식으로 해결 할 수 있습니다.

What is AppDomain?

AppDomain이란 .Net 환경에서 Application이 실행되는 환경을 의미하며, .Net 플랫폼에서는 AppDomain단위로 여러 프로세스들을 구분하고 격리함으로서 각 프로세스간의 안정성을 확보 할 수 있도록 도와줍니다. 서로다른 프로세스를 격리시킨다는 점에서 Win32와 유사하다고 할 수 있지만, AppDomain에는 보안, 버전, 어셈블리 관리등을 위한 기능을 제공합니다.

Load Assembly in Runtime using AppDomain

AppDomain에 접근하기 위해 System.AppDomain 클래스를 이용할 수 있습니다. AppDomain클래스의 Static멤버인 CurrentDomain 속성을 이용하면 현재 프로세스가 실행중인 AppDomain에 접근 할 수 있습니다. AppDomain에는 Assembly와 관련하여 AssemblyLoad이벤트와 AssemblyResolve이벤트를 제공하는데, AssemblyLoad이벤트는 AppDomain내에서 Assembly가 Load되었을때 발생하며, AssemblyResolve는 AppDomain내에서 Load하고자 하는 Aseembly를 발견하지 못했을 경우 발생합니다.
Application에서 참조하는 DLL(Assembly)을 발견하지 못했을 경우에도 AssemblyResolve이벤트가 발생을 하는데요, AssemblyResolve 이벤트에서 참조하는 Assembly를 직접 생성해 줌으로서 기본위치에 등록되어 있지 않은 Assembly를 사용할 수 있습니다. 아래는 AppDomain의 AssemblyResolve이벤트를 통해 동적으로 Assembly를 Load하는 내용의 코드입니다.


위 코드에서는 Assembly 클래스의 LoadFile 메서드를 이용해 파일로부터 Assembly를 생성했지만, AssemblyResolve 이벤트 부분을 아래와 같이 구현하여 현재 Assembly내에 포함된 Resource에서  Assembly를 Load 할 수도 있습니다.

Development Tip

이번 강좌에서는 AppDomain을 이용해 Runtime에 Assembly를 Load하는 하는 방법에 대해 소개했지만, 단순히 DLL(Assembly)를 특정 폴더에 위치시키고 관리하고자 하는 경우에는 App.Config 에 아래와 같이 probing path를 명시하는 방법으로도 해결 할 수 있습니다.