응용 프로그램 도메인 개요
업데이트: 2007년 11월
지금까지는 동일한 컴퓨터에서 실행 중인 여러 응용 프로그램을 격리시키기 위해 프로세스 경계를 사용했습니다. 각 응용 프로그램은 독립된 프로세스에 로드되어 동일한 컴퓨터에서 실행 중인 다른 컴퓨터와 격리됩니다.
메모리 주소는 프로세스에 상대적이고 한 프로세스에서 다른 프로세스로 전달된 메모리 포인터는 대상 프로세스에서 의미 있는 방식으로 사용될 수 없으므로 응용 프로그램이 격리됩니다. 또한 두 프로세스를 서로 직접 호출할 수 없습니다. 대신 간접 참조 수준을 제공하는 프록시를 사용해야 합니다.
관리 코드는 확인 프로세스를 통과해야 실행할 수 있습니다. 단, 관리자가 이 프로세스를 건너 뛸 수 있는 권한을 부여한 경우는 예외입니다. 확인 프로세스는 해당 코드가 잘못된 메모리 주소에 액세스할 수 있는지 또는 실행 중인 프로세스를 정상적으로 작동할 수 없게 하는 일부 다른 작업을 수행할 수 있는지 등을 확인합니다. 확인 테스트를 통과하는 코드를 형식이 안전한 코드라고 합니다. 코드를 형식에 안전하다고 확인하는 기능을 통해 공용 언어 런타임에서는 성능상의 손실을 낮추고 프로세스 경계 만큼의 높은 격리 수준을 제공합니다.
응용 프로그램 도메인은 공용 언어 런타임에서 응용 프로그램 간에 격리를 제공하기 위해 사용할 수 있는 더욱 안전한 다용도의 처리 단위를 제공합니다. 사용자는 여러 응용 프로그램 도메인을 하나의 프로세스에서 실행할 때, 별개의 프로세스에 존재하도록 동일한 격리 수준을 유지하면서도 프로세스 간에 크로스 프로세스 호출 또는 전환으로 인한 추가 오버헤드가 발생하지 않도록 할 수 있습니다. 단일 프로세스에서 여러 응용 프로그램을 실행할 수 있는 기능을 통해 서버 확장성이 상당히 증가합니다.
또한 응용 프로그램 격리는 응용 프로그램 보안 측면에서도 중요합니다. 예를 들면 각 컨트롤이 서로의 데이터와 리소스에 액세스할 수 없는 방식으로 여러 웹 응용 프로그램의 컨트롤을 단일 브라우저 프로세스에서 실행할 수 있습니다.
응용 프로그램 도메인에서 제공하는 격리에는 다음과 같은 몇 가지 이점이 있습니다.
한 응용 프로그램에서 발생한 오류가 다른 응용 프로그램에 영향을 주지 않습니다. 형식이 안전한 코드는 메모리 오류를 일으킬 수 없으므로 응용 프로그램 도메인을 사용하면 한 도메인에서 실행 중인 코드가 프로세스의 다른 응용 프로그램에 영향을 줄 수 없습니다.
전체 프로세스를 중지하지 않고 개별 응용 프로그램만 중지할 수 있습니다. 응용 프로그램 도메인을 사용하면 단일 응용 프로그램에서 실행 중인 코드를 언로드할 수 있습니다.
참고: 개별 어셈블리 또는 형식은 언로드할 수 없습니다. 전체 도메인만 언로드할 수 있습니다.
한 응용 프로그램에서 실행 중인 코드가 다른 응용 프로그램의 코드 또는 리소스에 직접 액세스할 수 없습니다. 공용 언어 런타임은 다른 응용 프로그램 도메인의 개체를 서로 직접 호출할 수 없도록 하여 이러한 격리를 적용합니다. 도메인 사이를 통과하는 개체는 복사되거나 프록시에 의해 액세스됩니다. 개체가 복사되는 경우 해당 개체에 대한 호출은 로컬입니다. 즉, 참조되는 개체와 호출자 둘 다 같은 응용 프로그램 도메인에 있습니다. 프록시를 통해 개체가 액세스되는 경우 해당 개체에 대한 호출은 원격입니다. 이 경우 참조되는 개체와 호출자는 서로 다른 응용 프로그램 도메인에 있습니다. 크로스 도메인 호출은 두 프로세스 또는 두 컴퓨터 사이의 호출과 동일한 원격 호출 인프라를 사용합니다. 따라서 메서드 호출을 올바르게 JIT로 컴파일할 수 있도록 하기 위해 참조되는 개체의 메타데이터를 두 응용 프로그램 도메인에서 모두 사용할 수 있어야 합니다. 호출하는 도메인이 호출되는 개체의 메타데이터에 액세스할 수 없는 경우 System.IO.FileNotFound 형식의 예외가 발생하여 컴파일할 수 없습니다. 자세한 내용은 .NET Remoting을 참조하십시오. 도메인 사이에서 개체에 액세스할 수 있는 방법을 결정하는 메커니즘은 개체에 의해 결정됩니다. 자세한 내용은 MarshalByRefObject 클래스를 참조하십시오.
코드의 동작 범위는 해당 코드가 실행되는 응용 프로그램에 의해 지정됩니다. 즉, 응용 프로그램 도메인은 응용 프로그램 버전 정책, 액세스하는 원격 어셈블리의 위치, 도메인으로 로드하는 어셈블리를 찾을 위치 관련 정보 등의 구성 설정을 제공합니다.
코드에 부여된 권한은 해당 코드가 실행 중인 응용 프로그램 도메인에서 제어할 수 있습니다.