AppDomain
Určuje, že by každé domény aplikace spravované aplikace vlastní kopii určitým členem globální proměnné nebo statické proměnné.Další informace naleznete v tématu Domény aplikace a Visual C++.
Každá doména aplikace má vlastní kopii proměnné appdomain.Konstruktor proměnné domény appdomain se provádí sestavení je načten do domény aplikace a provedení se objekt při uvolnění domény aplikace.
Pokud chcete všechny aplikační domény v rámci procesu v společný jazykový modul runtime sdílet globální proměnnou, použít __declspec(process) modifikátor.__declspec(process)ve skutečnosti je standardně ve /clr a __declspec(appdomain) je standardně ve /clr:pure.__declspec(appdomain)je vynuceno pod /clr:safe.
__declspec(appdomain)je platná pouze při jedné z /clr se používá volby kompilátoru.Globální proměnná, statické členské proměnné nebo statická lokální proměnná lze označit s __declspec(appdomain).Jedná se o chybu použít __declspec(appdomain) na statické členy spravované typy, protože mají vždy toto chování.
Pomocí __declspec(appdomain) je podobné Podprocesu místní úložiště (TLS).Podprocesy jsou vlastní úložiště, stejně jako aplikační domény.Pomocí __declspec(appdomain) zajišťuje globální proměnná má vlastní úložiště v každé doméně aplikace vytvořené pro tuto aplikaci.
Existují určitá omezení pro použití na proces a proměnné appdomain; míchání Viz proces Další informace.
Například při spuštění programu, jsou inicializovány všechny proměnné na proces a potom jsou inicializovány všechny proměnné appdomain.Proto při inicializaci proměnné proces jej nemůže záviset na hodnotu kterékoli proměnné-aplikační domény.Je zároveň používat (přiřazení) za appdomain a proměnné procesu chybné praxí.
Informace o volání funkce v konkrétní aplikační domény viz Funkce call_in_appdomain.
Příklad
// 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);
}