appdomain

Yönetilen uygulamanızın her uygulama etki alanının belirli bir genel değişkenin veya statik üye değişkeninin kendi kopyasına sahip olması gerektiğini belirtir. Daha fazla bilgi için bkz . Uygulama Etki Alanları ve Visual C++ .

Her uygulama etki alanı, uygulama başına etki alanı değişkeninin kendi kopyasına sahiptir. Uygulama etki alanına bir derleme yüklendiğinde bir uygulama etki alanı değişkeninin oluşturucusunun yürütülmesi ve uygulama etki alanı kaldırıldığında yıkıcının yürütülmesi.

Ortak dil çalışma zamanındaki bir işlemdeki tüm uygulama etki alanlarının bir genel değişkeni paylaşmasını istiyorsanız değiştiriciyi __declspec(process) kullanın. __declspec(process)varsayılan olarak /clr altında etkindir. /clr:pure ve /clr:safe derleyici seçenekleri Visual Studio 2015'te kullanım dışıdır ve Visual Studio 2017'de desteklenmez.

__declspec(appdomain)yalnızca /clr derleyici seçeneklerinden biri kullanıldığında geçerlidir. yalnızca genel değişken, statik üye değişkeni veya statik bir yerel değişken ile __declspec(appdomain)işaretlenebilir. Her zaman bu davranışa sahip olduklarından, yönetilen türlerin statik üyelerine uygulanması __declspec(appdomain) bir hatadır.

Kullanımı__declspec(appdomain), İş Parçacığı Yerel Depolama (TLS) kullanımına benzer. İş parçacıklarının da uygulama etki alanları gibi kendi depolama alanları vardır. kullanmak __declspec(appdomain) , genel değişkenin bu uygulama için oluşturulan her uygulama etki alanında kendi depolama alanına sahip olmasını sağlar.

İşlem başına ve uygulama etki alanı başına değişkenlerin kullanımını karıştırmaya yönelik sınırlamalar vardır; daha fazla bilgi için işleme bakın.

Örneğin, program başlatıldığında tüm işlem başına değişkenler başlatılır, ardından tüm uygulama başına etki alanı değişkenleri başlatılır. Bu nedenle, işlem başına bir değişken başlatılırken, uygulama başına etki alanı değişkenlerinin değerine bağımlı olamaz. Uygulama etki alanı başına ve işlem değişkenleri başına kullanımı (atama) karıştırmak kötü bir uygulamadır.

Belirli bir uygulama etki alanındaki bir işlevi çağırma hakkında bilgi için bkz . call_in_appdomain İşlev.

Ö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);
}
__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

Ayrıca bkz.

__declspec
Anahtar Sözcükler