appdomain

Určuje, že každá doména aplikace spravované aplikace by měla mít vlastní kopii konkrétní globální proměnné nebo statické členské proměnné. Další informace najdete v tématu Domény aplikací a Visual C++ .

Každá doména aplikace má vlastní kopii proměnné domény pro jednotlivé aplikace. Konstruktor proměnné appdomain se spustí při načtení sestavení do domény aplikace a destruktor se spustí při uvolnění domény aplikace.

Pokud chcete, aby všechny domény aplikace v rámci procesu v modulu CLR (Common Language Runtime) sdílely globální proměnnou, použijte __declspec(process) modifikátor. __declspec(process) je ve výchozím nastavení v / clr. Možnosti kompilátoru /clr:pure a /clr:safe jsou v sadě Visual Studio 2015 zastaralé a v sadě Visual Studio 2017 nejsou podporované.

__declspec(appdomain) je platný pouze při použití jedné z možností kompilátoru /clr . Lze označit pouze globální proměnnou, statickou členovou proměnnou nebo statickou místní proměnnou __declspec(appdomain). Jedná se o chybu, která se vztahuje __declspec(appdomain) na statické členy spravovaných typů, protože toto chování mají vždy.

Použití __declspec(appdomain) se podobá použití protokolu TLS (Thread Local Storage). Vlákna mají vlastní úložiště, stejně jako domény aplikací. Použití __declspec(appdomain) zajišťuje, že globální proměnná má vlastní úložiště v každé doméně aplikace vytvořené pro tuto aplikaci.

Existují omezení pro kombinování použití jednotlivých procesů a proměnných domény aplikace; další informace najdete v tomto článku .

Například při spuštění programu se inicializují všechny proměnné pro jednotlivé procesy a pak se inicializují všechny proměnné domény pro jednotlivé aplikace. Proto při inicializaci proměnné pro jednotlivé procesy nemůže záviset na hodnotě žádné proměnné domény pro jednotlivé aplikace. Je vhodné kombinovat použití (přiřazení) jednotlivých domén appdomain a proměnných procesu.

Informace o tom, jak volat funkci v konkrétní doméně aplikace, najdete v tématu call_in_appdomain Funkce.

Příklad

// 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

Viz také

__declspec
Klíčová slova