응용 프로그램 도메인과 어셈블리

이 항목에서는 응용 프로그램 도메인과 어셈블리 사이의 관계에 대해 설명합니다. 어셈블리에 포함되어 있는 코드를 실행하려면 먼저 해당 어셈블리를 응용 프로그램 도메인에 로드해야 합니다. 일반적으로 응용 프로그램을 실행하면 여러 어셈블리가 응용 프로그램 도메인에 로드됩니다.

어셈블리가 로드되는 방식에 따라 프로세스에서 여러 응용 프로그램 도메인이 해당 어셈블리의 JIT(Just-In-Time) 컴파일된 코드를 공유할 수 있는지 여부와 어셈블리를 프로세스에서 언로드할 수 있는지 여부가 결정됩니다.

  • 어셈블리가 도메인 중립적으로 로드된 경우 동일한 보안 권한 부여 집합을 공유하는 모든 응용 프로그램 도메인에서 동일한 JIT 컴파일된 코드를 공유할 수 있으므로 응용 프로그램에 필요한 메모리가 줄어듭니다. 그러나 어셈블리를 프로세스에서 언로드할 수는 없습니다.

  • 어셈블리가 도메인 중립적으로 로드되지 않은 경우 해당 어셈블리가 로드된 모든 응용 프로그램 도메인에서 어셈블리를 JIT 컴파일해야 합니다. 그러나 어셈블리가 로드된 모든 응용 프로그램 도메인을 언로드하여 프로세스에서 어셈블리를 언로드할 수는 있습니다.

런타임 호스트는 런타임을 프로세스로 로드하는 경우 도메인 중립적으로 어셈블리를 로드할지 여부를 결정합니다. 관리되는 응용 프로그램의 경우 프로세스의 진입점 메서드에 LoaderOptimizationAttribute 특성을 적용하고 연관된 LoaderOptimization 열거형의 값을 지정합니다. 공용 언어 런타임을 호스팅하는 관리되지 않는 응용 프로그램의 경우에는 CorBindToRuntimeEx 함수 메서드를 호출할 때 적절한 플래그를 지정합니다.

도메인 중립 어셈블리를 로드할 수 있는 다음과 같은 세 가지 옵션이 있습니다.

  • SingleDomain에서는 어셈블리를 도메인 중립적으로 로드하지 않습니다. 단, 항상 도메인 중립적으로 로드되는 Mscorlib는 예외입니다. 이 설정은 일반적으로 호스트가 프로세스에서 단일 응용 프로그램을 실행 중인 경우에만 사용되므로 단일 도메인이라고 합니다.

  • MultiDomain에서는 모든 어셈블리를 도메인 중립적으로 로드합니다. 프로세스에 여러 응용 프로그램 도메인이 있고 모두 동일한 코드를 실행하는 경우 이 설정을 사용합니다.

  • MultiDomainHost에서는 강력한 이름의 어셈블리와 이 어셈블리의 모든 종속 어셈블리가 전역 어셈블리 캐시에 설치되어 있는 경우 강력한 이름의 어셈블리를 도메인 중립적으로 로드합니다. 다른 어셈블리는 해당 어셈블리가 로드되는 각 응용 프로그램 도메인에 대해 개별적으로 로드되고 JIT 컴파일되므로 프로세스에서 언로드할 수 있습니다. 동일한 프로세스에서 둘 이상의 응용 프로그램을 실행할 경우나 여러 응용 프로그램 도메인에서 공유되는 어셈블리와 프로세스에서 언로드해야 하는 어셈블리가 혼합된 경우 이 설정을 사용합니다.

Assembly 클래스의 LoadFrom 메서드를 사용하여 로드 컨텍스트로 로드한 어셈블리나 바이트 배열을 지정하는 Load 메서드의 오버로드를 사용하여 이미지에서 로드한 어셈블리의 경우 JIT 컴파일된 코드를 공유할 수 없습니다.

Ngen.exe(네이티브 이미지 생성기)를 사용하여 네이티브 코드로 컴파일된 어셈블리는 프로세스에 처음 로드될 때 도메인 중립적으로 로드된 경우 여러 응용 프로그램 도메인에서 공유할 수 있습니다.

응용 프로그램 진입점이 포함된 어셈블리의 JIT 컴파일된 코드는 모든 종속 어셈블리를 공유할 수 있는 경우에만 공유됩니다.

도메인 중립 어셈블리는 두 번 이상 JIT 컴파일할 수 있습니다. 예를 들어, 보안 권한 부여 집합이 각기 다른 두 응용 프로그램 도메인에서 동일한 JIT 컴파일된 코드를 공유할 수 없습니다. 그러나 JIT 컴파일된 어셈블리의 각 복사본은 동일한 권한 부여 집합이 있는 다른 응용 프로그램 도메인과 공유할 수 있습니다.

어셈블리를 도메인 중립적으로 로드할지 여부를 결정할 때는 메모리 사용량 감소와 기타 성능 요인 간의 균형을 조절해야 합니다.

  • 도메인 중립 어셈블리의 경우 어셈블리를 격리시켜야 하므로 정적 데이터 및 메서드에 액세스하는 속도가 느립니다. 어셈블리에 액세스하는 각 응용 프로그램 도메인은 정적 필드의 개체에 대한 참조가 도메인 경계를 지나지 않도록 정적 데이터의 개별 복사본을 가지고 있어야 합니다. 결과적으로 런타임은 호출자에 추가 논리를 포함시켜서 정적 데이터 또는 메서드의 적절한 복사본으로 사용합니다. 이 추가 논리는 호출 속도를 늦춥니다.

  • 어셈블리에 도메인 중립적으로 로드할 수 없는 종속 어셈블리가 있으면 해당 어셈블리가 도메인 중립적으로 로드되지 않으므로 어셈블리를 도메인 중립적으로 로드할 때는 해당 어셈블리의 모든 종속 어셈블리를 찾아서 로드해야 합니다.

참고 항목

개념

응용 프로그램 도메인

공용 언어 런타임의 어셈블리