다음을 통해 공유


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);
}
  

참고 항목

참조

__declspec

C + + 키워드