appdomainappdomain

マネージド アプリケーションの各アプリケーション ドメインは特定のグローバル変数または静的メンバー変数の独自のコピーを持つ必要があることを指定します。Specifies that each application domain of your managed application should have its own copy of a particular global variable or static member variable. 参照してくださいアプリケーション ドメインと Visual C詳細についてはします。See Application Domains and Visual C++ for more information.

あらゆるアプリケーション ドメインに appdomain ごとの変数のコピーが存在します。Every application domain has its own copy of a per-appdomain variable. appdomain 変数のコンストラクターはアセンブリがアプリケーション ドメインに読み込まれるときに実行され、デストラクターはアプリケーション ドメインがアンロードされるときに実行されます。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.

共通言語ランタイムのプロセス内ですべてのアプリケーション ドメインがグローバル変数を共有する場合は、__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) 既定で有効な/clrします。__declspec(process) is in effect by default under /clr. /Clr: 純粋な/clr:safeコンパイラ オプションは Visual Studio 2015 で非推奨とされ、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) 有効な場合の 1 つ、 /clrコンパイラ オプションを使用します。__declspec(appdomain) is only valid when one of the /clr compiler options is used. __declspec(appdomain) でマークできるのは、グローバル変数、静的メンバー変数、または静的ローカル変数だけです。Only a global variable, static member variable, or a static local variable can be marked with __declspec(appdomain). マネージド型の静的メンバーに __declspec(appdomain) を適用するとエラーになります。そのようなメンバーは常にこの動作をするためです。It is an error to apply __declspec(appdomain) to static members of managed types because they always have this behavior.

使用して__declspec(appdomain)使用と似ていますスレッド ローカル ストレージ (TLS)します。Using __declspec(appdomain) is similar to using Thread Local Storage (TLS). スレッドは、アプリケーション ドメインと同様に独自のストレージを持ちます。Threads have their own storage, as do application domains. __declspec(appdomain) を使用すると、このアプリケーションで作成された各アプリケーション ドメインで、グローバル変数が独自のストレージを持つことが保証されます。Using __declspec(appdomain) ensures the global variable has its own storage in each application domain created for this application.

混在プロセスおよび appdomain 変数ごとの使用に制限があります。参照してくださいプロセス詳細についてはします。There are limitations to mixing the use of per process and per appdomain variables; see process for more information.

たとえば、プログラムの開始時に、すべての process ごとの変数が初期化され、続いて、すべての appdomain ごとの変数が初期化されます。For example, at program start up, all per-process variables are initialized, then all per-appdomain variables are initialized. そのため、process ごとの変数が初期化されるときには、appdomain ごとの変数の値に依存することはできません。Therefore when a per-process variable is being initialized, it cannot depend on the value of any per-application domain variable. appdomain ごとの変数と process ごとの変数を混在使用 (代入) することは好ましくありません。It is bad practice to mix the use (assignment) of per appdomain and per process variables.

特定のアプリケーション ドメインで関数を呼び出す方法については、次を参照してください。 call_in_appdomain 関数します。For information on how to call a function in a specific application domain, see call_in_appdomain Function.

Example

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

関連項目See also

__declspec__declspec
キーワードKeywords