appdomain
指定受管理的應用程式的每個應用程式定義域都應該有特定的全域變數或靜態成員變數之各自複本。 如需詳細資訊,請參閱 應用程式定義域和 Visual C++。
每個應用程式定義域會有一個 appdomain 每一變數之各自複本。 組件載入至應用程式定義域,並且卸載的應用程式定義域時執行解構函式會執行 appdomain 變數的建構函式。
如果您想要共用的全域變數 common language runtime 中的處理序中的所有應用程式定義域時,請使用__declspec(process)修飾詞。 __declspec(process)預設狀況下實際上是 /clr 和__declspec(appdomain)實際上是預設情況下**/clr:pure**。 __declspec(appdomain)強制在**/clr:safe**。
__declspec(appdomain)才有效時的其中一個**/clr**使用編譯器選項。 可以使用標記僅有一個全域變數、 靜態成員變數或靜態區域變數__declspec(appdomain)。 是要套用錯誤的__declspec(appdomain)的靜態成員 managed 型別,因為它們一定都會有這種行為。
使用__declspec(appdomain)類似於使用執行緒本機存放區 (TLS)。 執行緒都有自己的儲存體中,應用程式定義域也有。 使用__declspec(appdomain)可確保此全域變數為此應用程式建立的每個應用程式定義域中都有自己的儲存區。
有限制混合使用每個處理序而在每個 appdomain 變數 ; 請參閱處理程序如需詳細資訊。
例如,程式啟動時,所有的每個處理序變數都已初始化,則所有的 appdomain 每個變數都會初始化。 因此當初始化每個處理序變數時,它無法根據每個應用程式定義域中的任何變數的值。 它是以調配適當的使用 (工作分派) 每 appdomain 而在每個處理程序變數不佳的做法。
如需詳細資訊至特定的應用程式定義域中呼叫的函式,請參閱call_in_appdomain 函式。
範例
// 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);
}