appdomainappdomain

Spécifie que chaque domaine d'application de votre application managée doit avoir sa propre copie d'une variable globale ou d'une variable membre static particulière.Specifies that each application domain of your managed application should have its own copy of a particular global variable or static member variable. Pour plus d’informations , consultez domaines d’application et Visual C++ .See Application Domains and Visual C++ for more information.

Chaque domaine d'application a sa propre copie d'une variable par domaine d'application.Every application domain has its own copy of a per-appdomain variable. Un constructeur d'une variable de domaine d'application est exécuté lorsqu'un assembly est chargé dans un domaine d'application, et le destructeur est exécuté lorsque le domaine d'application est déchargé.A constructor of an appdomain variable is executed when an assembly is loaded into an application domain, and the destructor is executed when the application domain is unloaded.

Si vous voulez que tous les domaines d'application au sein d'un processus dans le Common Langage Runtime partagent une variable globale, utilisez le modificateur __declspec(process).If you want all application domains within a process in the common language runtime to share a global variable, use the __declspec(process) modifier. __declspec(process) est appliqué par défaut sous /CLR.__declspec(process) is in effect by default under /clr. Les options de compilateur /clr : pure et /clr : safe sont dépréciées dans Visual Studio 2015 et ne sont pas prises en charge dans Visual Studio 2017.The /clr:pure and /clr:safe compiler options are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

__declspec(appdomain) est valide uniquement lorsque l’une des options du compilateur /CLR est utilisée.__declspec(appdomain) is only valid when one of the /clr compiler options is used. Seules une variable globale, une variable membre static ou une variable locale static peuvent être marquées avec __declspec(appdomain).Only a global variable, static member variable, or a static local variable can be marked with __declspec(appdomain). Il est incorrect d'appliquer __declspec(appdomain) aux membres static des types managés, car ils ont toujours ce comportement.It is an error to apply __declspec(appdomain) to static members of managed types because they always have this behavior.

L’utilisation de __declspec(appdomain) est similaire à l’utilisation du stockage local des threads (TLS).Using __declspec(appdomain) is similar to using Thread Local Storage (TLS). Les threads ont leur propre stockage, tout comme les domaines d'application.Threads have their own storage, as do application domains. L'utilisation de __declspec(appdomain) assure que la variable globale possède son propre stockage dans chaque domaine d'application créé pour cette application.Using __declspec(appdomain) ensures the global variable has its own storage in each application domain created for this application.

Il existe des limitations pour mélanger l’utilisation des variables par processus et par AppDomain. Pour plus d’informations, consultez processus .There are limitations to mixing the use of per process and per appdomain variables; see process for more information.

Par exemple, au lancement du programme, toutes les variables par processus sont initialisées, puis toutes les variables par domaine d'application.For example, at program start up, all per-process variables are initialized, then all per-appdomain variables are initialized. Par conséquent, lorsqu'une variable par processus est en cours d'initialisation, elle ne peut pas dépendre de la valeur d'une quelconque variable par domaine d'application.Therefore when a per-process variable is being initialized, it cannot depend on the value of any per-application domain variable. Il n'est pas recommandé de combiner l'utilisation (assignation) de variables par processus et par domaine d'application.It is bad practice to mix the use (assignment) of per appdomain and per process variables.

Pour plus d’informations sur la façon d’appeler une fonction dans un domaine d’application spécifique, consultez Call_in_appdomain fonction.For information on how to call a function in a specific application domain, see call_in_appdomain Function.

ExempleExample

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

Voir aussiSee also

__declspec__declspec
Mots clésKeywords