.Net에서 애플리케이션 도메인 작업

애플리케이션 도메인은 경량 프로세스이며 코드, 애플리케이션 보안, 안정성 및 버전 관리를위한 격리 경계를 제공하는 논리적 경계 역할을합니다.

프로세스 경계는 동일한 시스템에서 실행되는 응용 프로그램을 격리하기 위해 오랫동안 사용되어 왔습니다. 프로세스는 프로그램의 실행중인 인스턴스입니다. 이 격리는 응용 프로그램이 메모리에 상주하고 다른 프로세스 경계에서 실행되도록하는 데 도움이됩니다. 따라서 동일한 애플리케이션 도메인에있는 두 개의 스레드는 서로 통신 할 수 있지만 두 개의 다른 애플리케이션 도메인에 속하는 두 개의 스레드는 통신 할 수 없습니다.

스레드는 프로세스 내에서 가장 작은 실행 단위입니다. 단일 프로세스 내부에 여러 애플리케이션 도메인이 있고 애플리케이션 도메인 내부에 둘 이상의 스레드가있을 수 있습니다. 응용 프로그램 도메인 (일반적으로 AppDomains라고 함)은 특정 응용 프로그램 도메인의 충돌이 다른 응용 프로그램 도메인의 기능에 영향을 미치지 않도록 동시에 동일한 프로세스 내에서 여러 응용 프로그램을 실행할 수 있도록하는 논리적 격리 단위입니다.

애플리케이션 도메인이 필요한 이유는 무엇입니까?

공용 언어 런타임 환경은 한 애플리케이션 내에서 실행되는 코드가 관리 환경의 컨텍스트 내에서 실행되는 다른 애플리케이션의 코드 나 리소스에 액세스 할 수 없도록합니다. 이것은 어떻게 이루어 집니까? 관리되는 환경 내에서 실행되는 관리 코드 또는 코드는 확인 프로세스를 거쳐야합니다. 이 확인은 형식 안전성을 보장하기 위해 CLR (공용 언어 런타임)에서 수행됩니다. 응용 프로그램 도메인은 CLR이 필요한 수준의 격리를 제공하는 데 도움이되므로 여러 응용 프로그램이 단일 프로세스의 컨텍스트 내에서 실행될 수 있으므로 많은 성능 오버 헤드가 없어 확장 성을 높일 수 있습니다.

MSDN은 "응용 프로그램 도메인은 공용 언어 런타임이 응용 프로그램 간 격리를 제공하는 데 사용할 수있는보다 안전하고 다양한 처리 단위를 제공합니다. 단일 프로세스에서 여러 응용 프로그램 도메인을 실행할 수 있습니다. 프로세스 간 호출이나 프로세스 간 전환에 따른 추가 오버 헤드를 발생시키지 않습니다. "

프로그래밍 방식으로 애플리케이션 도메인 만들기

프로그래밍 방식으로 새 응용 프로그램 도메인을 만들기 전에 현재 응용 프로그램 도메인의 메타 데이터를 검색하고 C #을 사용하여 어셈블리를 실행하는 방법을 살펴 보겠습니다. 다음 코드 조각은 현재 실행중인 어셈블리의 애플리케이션 도메인과 어셈블리 이름을 표시하는 방법을 보여줍니다.

using System;

using System.Threading;

using System.Reflection;

namespace ApplicationDomains

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine(Thread.GetDomain().FriendlyName);

            Console.WriteLine(Assembly.GetEntryAssembly().FullName);

            Console.ReadLine();

        }

    }

}

마찬가지로 AppDomain 클래스의 정적 멤버를 사용하여 호스트 및 하위 도메인의 메타 데이터 정보를 검색 할 수 있습니다.

using System;

namespace ApplicationDomains

{

    class Program

    {

        static void Main(string[] args)

        {

            AppDomain childApplicationDomain = AppDomain.CreateDomain("ApplicationDomain");

            Console.WriteLine("The host domain name is:  " + AppDomain.CurrentDomain.FriendlyName);

            Console.WriteLine("The host domain id is:  " + AppDomain.CurrentDomain.Id.ToString());

            Console.WriteLine("The child domain name is:  " + childApplicationDomain.FriendlyName);

            Console.WriteLine("The child domain id is:  " + childApplicationDomain.Id.ToString());

            Console.ReadKey();         

        }

    }

}

System.AppDomain 클래스의 오버로드 된 CreateDomain 메서드 중 하나를 사용하여 새 응용 프로그램 도메인을 만들 수 있습니다. 이러한 모든 메서드는 정적이므로 AppDomain 클래스를 인스턴스화 할 필요없이 호출 할 수 있습니다. 다음은 System.AppDomain 클래스의 오버로드 된 CreateDomain 메서드 목록입니다.

public static AppDomain CreateDomain(String appDomainName)

public static AppDomain CreateDomain(String appDomainName, Evidence securityInformation)

public static AppDomain CreateDomain(String appDomainName,

   Evidence securityInformation, AppDomainSetup appDomainSetupInformation)

public static AppDomain CreateDomain(String name,

   Evidence securityInformation, String appBasePath, String appRelativeSearchPath,

   bool shadowCopyFiles)

이러한 오버로드 된 CreateDomain 메소드를 사용하여 애플리케이션 도메인을 생성 할 수 있습니다. 생성하려는 애플리케이션 도메인의 이름을이 메소드에 매개 변수로 전달하기 만하면됩니다. 추가 매개 변수로 원하는 경우 보안 정책을 전달할 수도 있습니다. ExecuteAssembly 메서드는 응용 프로그램 도메인에서 어셈블리를로드하고 실행하는 데 사용됩니다.

다음 코드 목록은 새 응용 프로그램 도메인을 만든 다음 새로 만든 응용 프로그램 도메인 내에서 어셈블리를로드하고 실행하는 방법을 보여줍니다.

using System;

namespace ApplicationDomains

{

    class Program

    {

        static void Main(string[] args)

        {

            AppDomain applicationDomain = System.AppDomain.CreateDomain("AppDomain");

            applicationDomain.ExecuteAssembly(@"D:\Projects\TestCode.exe");

 Console.WriteLine("Press any key to unload the application domain...");

            Console.ReadKey();

            System.AppDomain.Unload(applicationDomain);

        }

    }

}

위의 프로그램이 실행되면 "AppDomain"이라는 새 응용 프로그램 도메인이 생성되고 응용 프로그램 도메인에로드 된 어셈블리 ( "TestCode.exe")가 실행됩니다. 생성 된 애플리케이션 도메인은 키를 누르면 언로드됩니다.