Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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