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