appdomain
Určuje, že každá aplikační doména spravované aplikace by měla mít svou vlastní kopii určité globální nebo statické členské proměnné.Další informace naleznete v tématu Domény aplikace a jazyk Visual C++.
Všechny domény aplikace mají svou vlastní kopii proměnné používané dle domény aplikace.Konstruktor proměnné domény aplikace je spuštěn po načtení sestavení do domény aplikace, destruktor je spuštěn po jejím uvolnění.
Chcete-li, aby všechny domény aplikace v procesu v modulu CLR (Common Language Runtime) sdílely globální proměnnou, použijte modifikátor __declspec(process).Ve výchozím nastavení platí při použití možnosti /clr modifikátor __declspec(process), při použití možnosti /clr:pure pak modifikátor __declspec(appdomain).Při použití možnosti /clr:safe je vynucen modifikátor __declspec(appdomain).
Modifikátor __declspec(appdomain) je platná pouze v případě, že je použita jedna z možností kompilátoru /clr.Modifikátorem __declspec(appdomain) může být označena pouze globální, statická členská nebo statická místní proměnná.Použití modifikátoru __declspec(appdomain) se statickými členy spravovaných typů je chybou, protože ty se takto chovají vždy.
Použití modifikátoru __declspec(appdomain) je podobné použití Úložiště místního pro vlákno (TLS).Vlákna mají svá vlastní úložiště stejně jako domény aplikace.Použitím modifikátoru __declspec(appdomain) je zajištěno, že globální proměnná bude mít své vlastní úložiště pro každou doménu aplikace vytvořenou pro tuto aplikaci.
Kombinování použití proměnných používaných dle procesu a dle domény aplikace má svá omezení. Další informace naleznete v tématu proces.
Například při spuštění programu jsou nejprve inicializovány všechny proměnné používané dle procesu, poté všechny proměnné používané dle aplikační domény.Proto proměnná používaná dle procesu nemůže při inicializaci záviset na hodnotě žádné proměnné používané dle domény aplikace.Nelze doporučit kombinovat použití (přiřazení) proměnných používaných dle aplikační domény a dle procesu.
Informace o volání funkcí v konkrétní doméně aplikace naleznete v tématu call_in_appdomain – funkce.
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);
}