appdomain
Указывает, что каждый домен приложения управляемого приложения должен иметь собственную копию указанных глобальной переменной или переменной статического элемента.Дополнительные сведения см. в разделе Домены приложений и Visual C++.
Каждый домен приложений имеет собственную копию переменной в-домена приложения.Конструктор переменной appdomain выполняется при загрузке сборки в домен приложения и деструктор выполняется при выгрузке домена приложения.
Если нужно, чтобы все домены приложения в процессе среды CLR использоваться совместно, используйте глобальная переменная __declspec(process) модификатор.__declspec(process) по умолчанию эффекта вниз /clr и __declspec(appdomain) по умолчанию эффекта вниз /clr:pure.__declspec(appdomain) принудительно вниз /clr:safe.
__declspec(appdomain) допустимо, только когда одно из /clr параметры компилятора используются.Только глобальная переменная переменную статического члена или статическую локальную переменную быть отмечен атрибутом __declspec(appdomain).Ошибка, которая будет применяться __declspec(appdomain) к статическим элементам управляемых типов, потому что они всегда имеют этого расширения функциональности.
использование __declspec(appdomain) аналогичен использованию Локальное хранилище потока (TLS).Потоки имеют свое собственное хранилище, как сделать домены приложений.использование __declspec(appdomain) гарантирует, что глобальная переменная имеет собственное хранилище в каждом домене приложений, созданный для этого приложения.
Ограничения на использование смешивание в процесса и в переменные appdomain; см. процесс для получения дополнительных сведений.
Например, в программе запуске в-процесса инициализируйте все переменные, а все переменные инициализируются в-домена приложения.Поэтому, когда переменная в-процесса инициализации, она не может зависеть от значения переменной домена для каждого приложения.Неверная практика смешивать использование (назначение) в appdomain и переменные процесса.
Дополнительные сведения о том, как вызвать функцию в конкретном домене приложения см. в разделе Функция call_in_appdomain.
Пример
// 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);
}