appdomain
각 응용 프로그램 도메인의 관리 되는 응용 프로그램 특정 전역 변수 또는 정적 멤버 변수의 자체 복사본이 있어야 한다는 지정 합니다.자세한 내용은 응용 프로그램 도메인 및 Visual C++를 참조하십시오.
모든 응용 프로그램 도메인 appdomain 당 변수의 자체 복사본이 있습니다.Appdomain 변수를 생성자는 응용 프로그램 도메인에 로드 된 어셈블리 및 응용 프로그램 도메인을 언로드할 때 소멸자가 실행 될 때 실행 됩니다.
모든 응용 프로그램 도메인을 프로세스에서 글로벌 변수를 공유 하는 공용 언어 런타임 내에서 사용할 경우 사용 하는 __declspec(process) 한정자.__declspec(process)기본적으로 적용 된 /clr 및 __declspec(appdomain) 기본적으로 적용 된 /clr:pure.__declspec(appdomain)아래 적용 됩니다 /clr:safe.
__declspec(appdomain)경우에 유효한 있습니다 중 하나는 /clr 컴파일러 옵션을 사용 합니다.만 전역 변수, 정적 멤버 변수 또는 정적 지역 변수를 표시할 수 있습니다 __declspec(appdomain).적용 오류입니다. __declspec(appdomain) 의 정적 멤버를이 문제 들 때문에 유형을 관리 합니다.
사용 하 여 __declspec(appdomain) 유사 스레드 로컬 저장소 (TLS ().응용 프로그램 도메인으로 스레드 자체 저장소에 있습니다.사용 하 여 __declspec(appdomain) 전역 변수에 전용 저장소가이 응용 프로그램에서 만든 각 응용 프로그램 도메인에 확인 합니다.
혼합 프로세스 및 appdomain 변수를 사용 하 여 제한 사항이 있습니다. 참조 하십시오 프로세스 에 대 한 자세한 내용은.
예를 들어, 프로그램 시작 시 모든 프로세스 별로 변수가 초기화 되는 다음 모든 appdomain 당 변수가 초기화 됩니다.따라서 프로세스별 변수 초기화 될 때 모든 응용 프로그램 도메인 변수의 값에 종속 될 수 없습니다.사용 (할당) appdomain 및 프로세스 변수를 혼합 하는 잘못 된 좋습니다.
특정 응용 프로그램 도메인에서 함수를 호출 하는 방법에 대 한 자세한 내용은 call_in_appdomain 함수.
예제
// declspec_appdomain.cpp
// compile with: /clr
#include <stdio.h>
using namespace System;
class CGlobal {
public:
CGlobal(bool bProcess) {
Counter = 10;
m_bProcess = bProcess;
Console::WriteLine("__declspec({0}) CGlobal::CGlobal constructor", m_bProcess ? (String^)"process" : (String^)"appdomain");
}
~CGlobal() {
Console::WriteLine("__declspec({0}) CGlobal::~CGlobal destructor", m_bProcess ? (String^)"process" : (String^)"appdomain");
}
int Counter;
private:
bool m_bProcess;
};
__declspec(process) CGlobal process_global = CGlobal(true);
__declspec(appdomain) CGlobal appdomain_global = CGlobal(false);
value class Functions {
public:
static void change() {
++appdomain_global.Counter;
}
static void display() {
Console::WriteLine("process_global value in appdomain '{0}': {1}",
AppDomain::CurrentDomain->FriendlyName,
process_global.Counter);
Console::WriteLine("appdomain_global value in appdomain '{0}': {1}",
AppDomain::CurrentDomain->FriendlyName,
appdomain_global.Counter);
}
};
int main() {
AppDomain^ defaultDomain = AppDomain::CurrentDomain;
AppDomain^ domain = AppDomain::CreateDomain("Domain 1");
AppDomain^ domain2 = AppDomain::CreateDomain("Domain 2");
CrossAppDomainDelegate^ changeDelegate = gcnew CrossAppDomainDelegate(&Functions::change);
CrossAppDomainDelegate^ displayDelegate = gcnew CrossAppDomainDelegate(&Functions::display);
// Print the initial values of appdomain_global in all appdomains.
Console::WriteLine("Initial value");
defaultDomain->DoCallBack(displayDelegate);
domain->DoCallBack(displayDelegate);
domain2->DoCallBack(displayDelegate);
// Changing the value of appdomain_global in the domain and domain2
// appdomain_global value in "default" appdomain remain unchanged
process_global.Counter = 20;
domain->DoCallBack(changeDelegate);
domain2->DoCallBack(changeDelegate);
domain2->DoCallBack(changeDelegate);
// Print values again
Console::WriteLine("Changed value");
defaultDomain->DoCallBack(displayDelegate);
domain->DoCallBack(displayDelegate);
domain2->DoCallBack(displayDelegate);
AppDomain::Unload(domain);
AppDomain::Unload(domain2);
}