본문 바로가기

IT 살이/04. 기술 - 프로그래밍

기본 AppDomain 생성자 변경하기

기본 AppDomain 생성자를 변경하는 작업이 왜 필요한지, 어디에 이용하는지를 묻는 사람이 있어서 달봉이가 어떻게 해서 여기까지 오게 되었는가를 잠시 덧붙인다.
달봉이가 현재 참여하고 있는 프로젝트에서 IE 페이지 하나에 스마트클라이언트 컨트롤 하나씩을 임베딩한다는 이야기가 있었다(현재는 EXE 컨테이너를 사용하는 방식으로 변경되긴 했지만). 그때 달봉이의 머리에 스친 의문을 해결하는 과정에서 AppDomain 생성이라는 것에까지 관심을 갖게 되었다. 달봉이가 가졌던 구체적인 의문은 지난 포스트(
IE 임베딩 방식 스마트클라이언트 애플리케이션의 도메인 중복 생성??)에서 볼 수 있다.
달봉이의 의문을 간단히 요약을 하면 다음과 같다.
『만약 <object> 태그로 스마트클라이언트 컨트롤을 로딩할때마다 클라이언트 PC에 AppDomain이 생성된다면 어떻게 될까? 그래서 같은 메뉴를 클릭할때마다 다른 AppDomain이 생성된다면 어떻게 될까? 』끔찍한 일이다. 답은 애플리케이션 도메인은 계속 생성되지 않는다는 것이다. 구체적인 내용은
포스트를 참조한다.
즉 달봉이는 AppDomain을 생성할때마다 로그를 남기는 작업이 필요했던 것이다. 해서 여기까지 오게 된 것이다.



이전 포스트에서 OS 프로세스와 Application Domain의 관계를 설명한 적이 있다.  이제 이 포스트에서는 OS 프로세스가 Application Domain을 생성할 때 그 과정에 참여할 수 있는 방법에 대해서 알아본다.

1236297958 

AppDomain 생성 과정

그림처럼 하나의 OS 프로세스는 CLR을 호스팅하고 CLR은 여러 개의 AppDomain 인스턴스를 생성할 수 있게 된다. CLR이 AppDomain 인스턴스를 생성할 때 System.AppDomainManager를 사용하게 되는데, AppDomainManager 확장을 통해서Application Domain 인스턴스 생성에 참여할 수 있게 된다.

■ AppDomainManager 확장

다음은 기본 AppDomainManager을 확장하는 코드이다. 상세한 코드는 참조 문서에서 소개하는 shawnfa 블로그를 참조한다.

public class MyAppDomainManager : AppDomainManager
  {

       public MyAppDomainManager() : base() ;
       public override AppDomain CreateDomain(…) 메소드
       //
       // .... 다른 메소드와 속성들
       //
  }

■ 확장된 AppDomainManager 정보 등록

1) 확장된 AppDomainManager 정보를 가지고 있는 어셈블리를 GAC에 등록한다.
2) 확장한 MyAppDomainManager에 대한 정보를 다음처럼 명령창을 이용해서 환경 변수에 설정한다. 레지스트리에 등록할 수도 있다. shawnfa 블로그를 참조한다.

C:\>set APPDOMAIN_MANAGER_TYPE
= MyNameSpace.MyAppDomainManager

C:\>set APPDOMAIN_MANAGER_ASM
= AppDomainManagerAssembly
, Version=1.0.0.0
, Culture=neutral
, PublicKeyToken=f1368f7b12a08d72

이제 PC에서 CLR이 AppDomain을 생성할 때 사용하는 생성자는 MyAppDomainManager(), CreateDomain()을 사용한다. 기본 클래스 AppDomainManager에서 제공하는 메소드 및 속성이 어떤 의미를 갖는지 정리한다. 우선 AppDomainManager 인스턴스 생성시 참여할 수 방법을 제공하는 메소드이다.
1263551021

기타 커스터마이징이 가능한 속성 및 메소드들이다.

1305858498

좀 더 자세한 내용을 위해서는 다음 링크 페이지를 참조한다.

참조문서

AppDomainManager 클래스 - MSDN
http://msdn2.microsoft.com/en-us/library/system.appdomainmanager.aspx

The Managed Hosting API ? shawnfa 블로그
http://blogs.msdn.com/shawnfa/archive/2004/11/12/256550.aspx
Customizing the AppDomain Creation Process ? shawnfa 블로그
http://blogs.msdn.com/shawnfa/archive/2004/11/17/259105.aspx