Compartilhar via


AppDomain

Especifica que cada domínio do aplicativo do seu aplicativo gerenciado deve ter sua própria cópia de uma variável de membro estático ou variável global específico.Consulte Domínios de aplicativos e Visual C++ para obter mais informações.

Cada domínio de aplicativo possui sua própria cópia de uma variável por appdomain.Um construtor de uma variável de appdomain é executado quando um assembly é carregado em um domínio de aplicativo e o destruidor é executado quando o domínio de aplicativo é descarregado.

Se desejar que todos os domínios de aplicativo dentro de um processo no common language runtime para compartilhar uma variável global, use o __declspec(process) modificador.__declspec(process)está em vigor por padrão em /clr e __declspec(appdomain) está em vigor por padrão em /clr:pure.__declspec(appdomain)é imposta em /clr:safe.

__declspec(appdomain)só é válido quando um do /clr as opções do compilador é usado.Somente uma variável global, a variável de membro estático ou um variável local estática pode ser marcado com __declspec(appdomain).É um erro ao aplicar __declspec(appdomain) para membros estáticos de tipos gerenciados, porque eles sempre têm esse comportamento.

Usando __declspec(appdomain) é semelhante ao uso Armazenamento Local de segmento (TLS).Segmentos têm seu próprio armazenamento, como domínios de aplicativo.Usando __declspec(appdomain) garante a variável global tem seu próprio armazenamento em cada domínio de aplicativo criado para este aplicativo.

Há limitações à combinação de uso de cada processo e por appdomain variáveis; consulte processo para obter mais informações.

Por exemplo, no início do programa backup, todas as variáveis de cada processo são inicializadas e todas as variáveis por appdomain são inicializadas.Portanto, quando uma variável por processo está sendo inicializada, ele não pode depender o valor de qualquer variável de domínios de aplicativo.É uma prática inadequada para combinar o uso (atribuição) de por appdomain e por variáveis de processo.

Para obter informações sobre como chamar uma função em um domínio de aplicativo específico, consulte Função call_in_appdomain.

Exemplo

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

Consulte também

Referência

__declspec

Palavras-chave C++