appdomain
Specifica che ogni dominio dell'applicazione gestita deve disporre di una copia distinta di una variabile globale o di una variabile membro statico particolare.Per ulteriori informazioni, vedere Domini applicazione e Visual C++.
Ogni dominio applicazione dispone della propria copia di una variabile di dominio.Un costruttore di una variabile del dominio applicazione viene eseguito quando un assembly viene caricato in un dominio applicazione e il distruttore viene eseguito quando il dominio applicazione viene scaricato.
Se si desidera che tutti i domini applicazione all'interno di un processo in Common Language Runtime per condividere una variabile globale, utilizzare __declspec(process) modificatore.__declspec(process) è abilitata per impostazione predefinita in /clr e __declspec(appdomain) è abilitata per impostazione predefinita in /clr:pure.__declspec(appdomain) si applica a /clr:safe.
__declspec(appdomain) è valido solo quando uno di /clr le opzioni del compilatore viene utilizzata.Solo una variabile globale, la variabile membro statico, o una variabile locale statica possono essere contrassegnati con __declspec(appdomain).È un errore da applicare __declspec(appdomain) ai membri statici dei tipi gestiti poiché hanno sempre questo comportamento.
Tramite __declspec(appdomain) è simile a l Memoria locale di thread (TLS).I thread sono relativa archiviazione, analogamente a domini applicazione.Tramite __declspec(appdomain) garantisce la variabile globale dispone di archiviazione in ogni dominio applicazione creato per questa applicazione.
Esistono alcune limitazioni a combinare l'utilizzo di per il processo e per variabili del dominio applicazione; vedere processo per ulteriori informazioni.
Ad esempio, il programma avviar su, tutte le variabili di processo vengono inizializzati, tutte le variabili di dominio vengono inizializzate.Di conseguenza quando una variabile per processo viene inizializzata, non può dipendere dal valore di una variabile del dominio dell'applicazione.È errata pratica combinare l'utilizzo assegnazione (=) per appdomain e variabili per processo.
Per informazioni su come chiamare una funzione in un determinato dominio applicazione, vedere Funzione call_in_appdomain.
Esempio
// 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);
}