appdomain
Especifica que cada dominio de aplicación de la aplicación administrada debe tener una copia de una variable global determinada o una variable miembro static.Para obtener más información, consulte Dominios de aplicación y Visual C++.
Cada dominio de aplicación tiene su propia copia de una variable de appdomain.Un constructor de una variable de appdomain se ejecuta cuando se carga un ensamblado en un dominio de aplicación, y se ejecuta destructor cuando se descarga el dominio de aplicación.
Si desea que todos los dominios de aplicación en un proceso en Common Language Runtime para compartir una variable global, utilice el modificador de __declspec(process) .__declspec(process) está activada de forma predeterminada en /clr y __declspec(appdomain) está activada de forma predeterminada en /clr:pure.__declspec(appdomain) se aplica en /clr:safe.
__declspec(appdomain) sólo es válido cuando una de las opciones del compilador /clr se utiliza.Sólo una variable global, una variable miembro static, o una variable local estática se pueden marcar con __declspec(appdomain).Es un error para aplicar __declspec(appdomain) miembros estáticos de tipos administrados porque siempre tienen este comportamiento.
Mediante __declspec(appdomain) es similar a utilizar almacenamiento local de subprocesos (TLS).Los subprocesos tienen su propio almacenamiento, así como los dominios de aplicación.Mediante __declspec(appdomain) garantiza la variable global tiene su propio almacenamiento en cada dominio de aplicación creado para esta aplicación.
Hay limitaciones para mezclar el uso por el proceso y por variables de appdomain; vea proceso para obtener más información.
Por ejemplo, en el inicio del programa, inicialice todas las variables de proceso, se inicializan todas las variables de appdomain.Por consiguiente cuando se inicializa una variable por proceso, no puede depender del valor de una variable del dominio de aplicación.Es recomendable incorrecta mezclar el uso (asignación) por el appdomain y por variables de proceso.
Para obtener información sobre cómo llamar a una función en un dominio de aplicación concreto, vea call_in_appdomain (Función).
Ejemplo
// 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);
}