Aracılığıyla paylaş


AppDomain

Her uygulama etki alanı yönetilen uygulamanın kendi kopyasını belirli genel değişken mi, yoksa statik üye değişkeni olması gerektiğini belirtir. Daha fazla bilgi için bkz. Uygulama Etki Alanları ve Visual C++.

Her uygulama etki alanının kendi kopyasını appdomain değişken vardır. Appdomain değişkenin bir kurucu bir derleme bir uygulama etki alanına yüklendi ve uygulama etki alanı bellekten kaldırıldığında yıkıcı yürütülen yürütülür.

Tüm uygulama etki alanları bir işlemde bir Genel deðiþken paylaşmak için ortak dil çalışma zamanı içinde isterseniz, __declspec(process) değiştirici. __declspec(process)Varsayılan olarak altında etkili olduğu /clr ve __declspec(appdomain) altında varsayılan olarak etkin olan /clr:pure. __declspec(appdomain)altında zorlanan /clr:safe.

__declspec(appdomain)geçerli olduğunda yalnızca birini /clr derleyici seçenekleri kullanılır. Genel bir deðiþken, statik bir üye değişkeni ya da yerel bir statik değişken ile işaretlenebilir __declspec(appdomain). Uygulamak için bir hata olduğunu __declspec(appdomain) statik üyeleri için her zaman bu davranışı olmadığı türleri yönetilen.

Kullanarak __declspec(appdomain) kullanmaya benzer İş parçacığı yerel depolama (tls). Uygulama etki alanları gibi kanalları kendi depolama sahiptir. Kullanarak __declspec(appdomain) bu uygulama için oluşturulan her uygulama etki alanındaki genel değişkeni olan kendi depolama sağlar.

Karıştırma işlemi ve appdomain değişkenler bazında kullanımını sınırlamalar vardır; Bkz: işlem daha fazla bilgi için.

Örneğin, programın başlatılması sırasında tüm işlem içi değişkenleri başlatılır sonra tüm uygulama başına değişken başlatılır. Bu nedenle işlem başına değişken başlatıldığında, uygulama başına etki alanı herhangi bir değişkenin değerine bağımlı olamaz. Kullanımı (atama) uygulama ve işlem değişkenler bazında karýþtýrmak kötü bir uygulamadır.

Belirli uygulama etki alanında bir işlev çağrısı hakkında daha fazla bilgi için bkz: call_in_appdomain işlevi.

Örnek

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

Ayrıca bkz.

Başvuru

__declspec

C++ anahtar sözcükler