appdomain
Gibt an, dass jede Anwendungsdomäne der verwalteten Anwendung über eine eigene Kopie einer bestimmten globalen statischen Variablen oder Membervariablen zugewiesen werden soll.Weitere Informationen finden Sie unter Anwendungsdomänen und Visual C++.
Jede Anwendungsdomäne verfügt über eine eigene Kopie einer einzelnen AppDomain-Variable.Ein Konstruktor einer appdomain Variable wird ausgeführt, wenn eine Assembly in eine Anwendungsdomäne geladen wird und der Destruktor wird ausgeführt, wenn die Anwendungsdomäne entladen wird.
Wenn Sie alle Anwendungsdomänen innerhalb eines Prozesses in der Common Language Runtime eine globale Variable verwenden möchten, verwenden Sie den __declspec(process)-Modifizierer.__declspec(process) ist standardmäßig aktiviert und __declspec(appdomain) unter /clr unter /clr:pureist standardmäßig aktiviert.__declspec(appdomain) wird unter /clr:safeerzwungen.
__declspec(appdomain) ist nur gültig, wenn eine der /clr-Compileroptionen verwendet wird.Nur eine globale Variable, eine statische Membervariable oder eine statische lokale Variable können mit __declspec(appdomain)gekennzeichnet sind.Es ist ein Fehler, um __declspec(appdomain) auf statische Member von verwalteten Typen angewendet werden, da sie immer dieses Verhalten aufweisen.
Verwenden __declspec(appdomain) entspricht der Verwendung von Lokaler Threadspeicher (TLS)vergleichbar.Threads sind ihre eigenen Speicher, wie Anwendungsdomänen ausführen.Verwenden __declspec(appdomain) stellt sicher, dass die globale Variable ihren eigenen Speicher in jeder Anwendungsdomäne verfügt, die für diese Anwendung erstellt wird.
Es gibt Einschränkungen zum Kombinieren des Verwendung pro Prozess und pro appdomain Variablen. Weitere Informationen finden Sie unter Prozess .
Zum Beispiel oben am Programm starten Sie alle Variablen pro Prozess initialisiert werden, werden alle pro AppDomain-Variablen initialisiert.Deshalb, wenn eine Variable pro Prozess initialisiert wurde, kann es nicht den Wert einer Variable Domänen pro Anwendung abhängen.Es ist üblich, wie ein ungültiges (Zuweisung) von pro appdomain und pro Prozess variablen zu kombinieren.
Weitere Informationen zum Erstellen einer Funktion in einer bestimmten Anwendungsdomäne finden Sie unter call_in_appdomain-Funktionaufruft.
Beispiel
// 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);
}