Udostępnij za pośrednictwem


elementu AppDomain

Określa, że każda domena aplikacji zarządzanych aplikacji powinien mieć swoją własną kopią zmienną określonego członka globalnej zmiennej lub statyczne.Zobacz Domen aplikacji i Visual C++ Aby uzyskać więcej informacji.

Domeny aplikacji, co ma własną kopię zmiennej dla elementu appdomain.Konstruktor elementu appdomain zmiennej jest wykonywany, gdy zestaw jest ładowany do domeny aplikacji i destruktora jest wykonywany, gdy domena aplikacji jest zwolniony.

Jeśli chcesz, aby wszystkie domeny aplikacji wewnątrz procesu w common language runtime do udostępniania zmiennej globalnej, użyj __declspec(process) modyfikator.__declspec(process)obowiązuje domyślnie w ramach /CLR i __declspec(appdomain) jest domyślnie pod /clr:pure.__declspec(appdomain)jest wymuszane w ramach /clr:safe.

__declspec(appdomain)jest prawidłowa tylko wtedy gdy jeden z /clr jest używane opcje kompilatora.Tylko zmiennej globalnej, zmienna członka statycznego lub statyczna zmienna lokalna może być oznaczone __declspec(appdomain).Jest błędem, aby zastosować __declspec(appdomain) do statycznej członków zarządzane typy, ponieważ mają to zachowanie.

Za pomocą __declspec(appdomain) jest podobne do korzystania z Wątku lokalnego magazynu (TLS).Wątki mają własne składowania, jak domen aplikacji.Za pomocą __declspec(appdomain) zapewnia zmienna globalna ma swój własny magazyn w każdej domenie aplikacji utworzone dla tej aplikacji.

Istnieją pewne ograniczenia dotyczące mieszanie stosowania na proces i na zmiennych elementu appdomain; zobacz proces Aby uzyskać więcej informacji.

Na przykład na uruchamianie programu, wszystkie zmienne na proces są inicjowane, a następnie są inicjowane wszystkie zmienne dla elementu appdomain.Dlatego, gdy zmienna na proces jest inicjowany, nie zależy na wartość zmiennej żadnych domen dla każdej aplikacji.Wymieszać użycie (przydział) dla domeny appdomain i na proces zmiennych bad praktyką jest.

Aby uzyskać informacje, jak wywołać funkcję w domenie określonej aplikacji, zobacz Funkcja call_in_appdomain.

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);
}
  

Zobacz też

Informacje

__declspec

Słów kluczowych języka C++