appdomain
Spécifie que chaque domaine d'application managée doit avoir sa propre copie d'une variable globale ou d'une variable membre static particulière.Consultez Domaines d'application et Visual C++ pour plus d'informations.
Chaque domaine d'application a sa propre copie d'un par appdomain variable.Un constructeur d'une variable appdomain sont exécutés lorsqu'un assembly est chargé dans un domaine d'application, et le destructeur est exécuté lorsque le domaine d'application est en cours.
Si vous voulez que tous les domaines d'application dans un processus dans le common langage runtime pour partager une variable globale, utilisez le modificateur d' __declspec(process) .__declspec(process) est appliquée par défaut sous /clr et __declspec(appdomain) est appliquée par défaut sous /clr:pure.__declspec(appdomain) est appliquée sous /clr:safe.
__declspec(appdomain) est uniquement valide lorsque l'une des options du compilateur pour /clr est utilisée.Une seule variable globale, la variable membre statique, ou une variable locale statique peuvent être marqués avec __declspec(appdomain).Il est erroné d'appliquer __declspec(appdomain) aux membres statiques des types managés car ils ont toujours ce comportement.
À l'aide de __declspec(appdomain) est semblable à l'utilisation stockage local des threads (TLS).Les threads ont leur propre stockage, ainsi que les domaines d'application.À l'aide de __declspec(appdomain) garantit la variable globale possède son propre stockage dans chaque domaine d'application créé pour cette application.
Il existe des limitations à combiner l'utilisation de par le processus et aux variables appdomain ; consultez processus pour plus d'informations.
Par exemple, au lancement du programme, toutes les variables de processus sont initialisées, puis tous par appdomain variables sont initialisés.Par conséquent lorsqu'une variable par est initialisée, il ne peut pas dépendre de la valeur d'une variable de domaine d'application.Il est recommandé de mauvais habitudes de combiner l'utilisation (assignation) de par appdomain et aux variables de processus.
Pour des informations sur la façon d'appeler une fonction dans un domaine d'application spécifique, consultez call_in_appdomain, fonction.
Exemple
// 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);
}