appdomain
Określa, że każda domena aplikacji zarządzanej aplikacji powinna mieć własną kopię określonej zmiennej globalnej lub statycznej zmiennej składowej. Aby uzyskać więcej informacji, zobacz Domeny aplikacji i Visual C++ .
Każda domena aplikacji ma własną kopię zmiennej per-appdomain. Konstruktor zmiennej appdomain jest wykonywany, gdy zestaw jest ładowany do domeny aplikacji, a destruktor jest wykonywany podczas zwalniania domeny aplikacji.
Jeśli chcesz, aby wszystkie domeny aplikacji w procesie w środowisku uruchomieniowym języka wspólnego współużytkować zmienną globalną, użyj __declspec(process)
modyfikatora. __declspec(process)
jest domyślnie w obszarze /clr. Opcje kompilatora /clr:pure i /clr:safe są przestarzałe w programie Visual Studio 2015 i nieobsługiwane w programie Visual Studio 2017.
__declspec(appdomain)
jest prawidłowy tylko wtedy, gdy jest używana jedna z opcji kompilatora /clr . Można oznaczyć tylko zmienną globalną, statyczną zmienną składową lub statyczną zmienną lokalną.__declspec(appdomain)
Jest to błąd stosowania __declspec(appdomain)
do statycznych elementów członkowskich typów zarządzanych, ponieważ zawsze mają to zachowanie.
Funkcja Using __declspec(appdomain)
jest podobna do użycia magazynu lokalnego wątku (TLS). Wątki mają własny magazyn, podobnie jak domeny aplikacji. Użycie __declspec(appdomain)
zapewnia, że zmienna globalna ma własny magazyn w każdej domenie aplikacji utworzonej dla tej aplikacji.
Istnieją ograniczenia dotyczące mieszania użycia zmiennych per process i per appdomain; Zobacz proces , aby uzyskać więcej informacji.
Na przykład podczas uruchamiania programu wszystkie zmienne dla procesu są inicjowane, a następnie inicjowane są wszystkie zmienne dla domeny aplikacji. W związku z tym, gdy zmienna dla procesu jest inicjowana, nie może zależeć od wartości dowolnej zmiennej domeny dla aplikacji. Dobrym rozwiązaniem jest mieszanie użycia (przypisania) dla poszczególnych zmiennych appdomain i poszczególnych procesów.
Aby uzyskać informacje na temat 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);
}
__declspec(process) CGlobal::CGlobal constructor
__declspec(appdomain) CGlobal::CGlobal constructor
Initial value
process_global value in appdomain 'declspec_appdomain.exe': 10
appdomain_global value in appdomain 'declspec_appdomain.exe': 10
__declspec(appdomain) CGlobal::CGlobal constructor
process_global value in appdomain 'Domain 1': 10
appdomain_global value in appdomain 'Domain 1': 10
__declspec(appdomain) CGlobal::CGlobal constructor
process_global value in appdomain 'Domain 2': 10
appdomain_global value in appdomain 'Domain 2': 10
Changed value
process_global value in appdomain 'declspec_appdomain.exe': 20
appdomain_global value in appdomain 'declspec_appdomain.exe': 10
process_global value in appdomain 'Domain 1': 20
appdomain_global value in appdomain 'Domain 1': 11
process_global value in appdomain 'Domain 2': 20
appdomain_global value in appdomain 'Domain 2': 12
__declspec(appdomain) CGlobal::~CGlobal destructor
__declspec(appdomain) CGlobal::~CGlobal destructor
__declspec(appdomain) CGlobal::~CGlobal destructor
__declspec(process) CGlobal::~CGlobal destructor
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla