특히 두 개의 서로 다른 애플리케이션 도메인에서 코드를 실행하는 것은 어떤 의미입니까?
데이터는 일반적으로 애플리케이션 도메인 경계를 통해 어떻게 전달됩니까? 프로세스 경계를 넘어 데이터를 전달하는 것과 동일합니까? 이 추상화에 대해 더 많이 알고 그것이 무엇에 유용한 지 궁금합니다.
편집 : 일반적으로 응용 프로그램 도메인을 이해하지 못함 에서 AppDomain 클래스의 좋은 기존 범위
특히 두 개의 서로 다른 애플리케이션 도메인에서 코드를 실행하는 것은 어떤 의미입니까?
데이터는 일반적으로 애플리케이션 도메인 경계를 통해 어떻게 전달됩니까? 프로세스 경계를 넘어 데이터를 전달하는 것과 동일합니까? 이 추상화에 대해 더 많이 알고 그것이 무엇에 유용한 지 궁금합니다.
편집 : 일반적으로 응용 프로그램 도메인을 이해하지 못함 에서 AppDomain 클래스의 좋은 기존 범위
답변:
응용 프로그램 도메인은 기본적으로 코드가 내부 프로세스의 실행되는 고립 된 영역을 제공합니다.
쉽게 생각할 수있는 방법은 메인 프로세스 내부에있는 경량 프로세스와 거의 같습니다. 각 AppDomain은 완전히 격리 된 상태로 프로세스 내에 존재하므로 별도의 보안 등을 사용하여 코드를 안전하게 실행할 수 있습니다 (필요한 경우 전체 프로세스를 분해하지 않고 언로드 할 수 있음).
세부 사항에 관해서는-프로세스 내에서 두 개의 다른 AppDomain에서 코드를 실행하면 코드가 격리되어 실행됩니다. AppDomain 간의 모든 통신은 직렬화되거나 MarshallByRefObject를 통해 처리됩니다. 이와 관련하여 원격 기능을 사용하는 것과 매우 유사합니다. 이것은 엄청난 양의 보안을 제공합니다. 신뢰할 수없는 코드를 실행할 수 있으며, 잘못된 일이 있어도 영향을 미치지 않습니다.
MSDN의 Application Domains 설명에 더 많은 세부 정보가 있습니다 .
프로세서 내부 세부 정보 관점에서 보면 코드 세그먼트 (CS) 레지스터에 대해 다른 값을 설정합니다. 코드 및 CS : IP (Instruction Pointer) 레지스터는 프로세서에서 실행중인 레지스터입니다.
(간결성을 위해 페이지 테이블 관련 토론을 훑어보기로 선택했습니다).
AppDomain은이 경계를 표시합니다. 코드 안전을 위해.
이 배경을 제공하는 이유는 다음과 같은 질문에서 벗어나는 것입니다. 1. 두 앱 도메인에서 리소스에 액세스하는 방법 (예 : CS : IP를 다른 앱 도메인으로 설정할 수 없기 때문에 파이프 또는 다른 공유 메커니즘을 사용하여 직접 액세스 할 수 있습니다. 이를 수행 할 수있는 것은 OS뿐입니다. CLR이 아닙니다.)
앱 도메인에 여러 스레드가있을 수 있습니다. 기술적으로는 CS 값이 현재 프로세스에있을 것이기 때문에 그렇습니다. 점프 문 (함수 호출 / 이동 조합)으로 IP를 다른 것으로 변경할 수 있습니다.
두 개의 다른 앱 도메인에있는 두 개의 스레드가 통신 할 수 있습니다 (No. 참조 포인트 1).
단일 앱 도메인의 두 스레드가 통신 할 수 있습니다 (예. 참조 포인트 2).
CS : IP의 작동 방식에 대한 지식이 거의없는 경우 이러한 경우의 여러 조합에 대한 답을 얻을 수 있습니다.
프로세스 내에서 실행되는 각 애플리케이션, AppDomain은 또한 경량 프로세스이거나 어셈블리 그룹 (어셈블리 그룹을 포함하는 컨테이너)을 포함하는 논리 단위라고 할 수 있으며 동일한 프로세스의 격리 수준에서 프로세스 내부에 존재합니다. , 이렇게하면 동일한 프로세스 내에서 여러 어셈블리를 실행하고 직접 액세스 할 수 없습니다.
AppDomain 내에서 Dot Net 응용 프로그램 실행 : 일단 dot net 응용 프로그램이 실행되면 운영 체제 셸이 CLR을 프로세스에로드하고 새 AppDomain이 동일한 프로세스에서 생성되고 생성 된 AppDomain의 모든 어셈블리를로드합니다. 이제 AppDomain 코드에서 실행됩니다.
AppDomain을 사용자 지정하는 경우 : 고유 한 AppDomain을 만들 수 있습니다. 이제 시나리오에서 고유 한 AppDomain을 만들 수 있습니다. 런타임에 실행중인 응용 프로그램을 중단하지 않고 어셈블리를 추가하거나 제거해야한다고 가정하면 자체 AppDomain을 만들 수 있습니다.