appdomain
Określa, że każda domena aplikacji z zarządzanej aplikacji powinna mieć swoją własną kopię konkretnej zmiennej globalnej lub statycznej.Aby uzyskać więcej informacji, zobacz Domeny aplikacji i program Visual C++.
Każda domena aplikacji posiada własną kopię zmiennej per domena aplikacji.Konstruktor zmiennej domeny aplikacji jest wykonywany gdy zestaw zostanie załadowany do domeny aplikacji, a destruktor jest wykonywany wtedy gdy domena aplikacji jest rozładowywana.
Jeśli chcesz, aby wszystkie domeny aplikacji w ramach procesu w środowisku uruchomieniowym języka wspólnego współdzieliły zmienną globalną, należy użyć modyfikatora __declspec(process).__declspec(process) jest w efekcie domyślnym zachowaniem podczas użycia /clr a __declspec(appdomain) jest w efekcie domyślnym zachowaniem podczas użycia /clr:pure.__declspec(appdomain) jest wymuszana podczas korzystania z /clr:safe.
__declspec(appdomain) można używać tylko wtedy gdy użyto jednej z opcji /clr kompilatora.Tylko zmienna globalna, statyczna zmienna członkowska lub statyczna zmienna lokalna może być oznaczona __declspec(appdomain).Błędem jest stosowanie __declspec(appdomain) do statycznych elementów członkowskich zarządzanych typów, ponieważ zawsze mają to zachowanie.
Użycie __declspec(appdomain) jest podobne do użycia Pamięci lokalnej wątku (TLS).Wątki mają własną pamięć, tak jak domena aplikacji.Użycie __declspec(appdomain) zapewnia zmiennej globalnej swoją własną pamięć w każdej domenie aplikacji, utworzonych dla tej aplikacji.
Istnieją pewne ograniczenia dotyczące mieszania użycia zmiennych per proces i per domena aplikacji; zobacz proces, aby uzyskać więcej informacji.
Na przykład podczas uruchamiania programu, wszystkie zmienne per proces są inicjowane, a następnie inicjowane są wszystkie zmienne per domena aplikacji.Dlatego podczas inicjowania zmiennej per proces, zmienna nie może zależeć od wartości zmiennej per jakakolwiek domena aplikacji.Mieszanie użycia (przypisywania) zmiennych per domena aplikacji i per proces to zła praktyka.
Aby uzyskać informacje dotyczące sposobu wywoływania funkcji w określonej domenie aplikacji, zobacz call_in_appdomain — Funkcja.
Przykład
// 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);
}