Share via


appdomain

Menentukan bahwa setiap domain aplikasi aplikasi terkelola Anda harus memiliki salinan variabel global atau variabel anggota statis tertentu sendiri. Lihat Domain Aplikasi dan Visual C++ untuk informasi selengkapnya.

Setiap domain aplikasi memiliki salinan variabel per-appdomain sendiri. Konstruktor variabel appdomain dijalankan ketika rakitan dimuat ke dalam domain aplikasi, dan destruktor dijalankan saat domain aplikasi dibongkar.

Jika Anda ingin semua domain aplikasi dalam proses dalam runtime bahasa umum untuk berbagi variabel global, gunakan pengubah __declspec(process) . __declspec(process) berlaku secara default di bawah /clr. Opsi pengkompilasi /clr:pure dan /clr:safe tidak digunakan lagi di Visual Studio 2015 dan tidak didukung di Visual Studio 2017.

__declspec(appdomain) hanya valid ketika salah satu opsi pengkompilasi /clr digunakan. Hanya variabel global, variabel anggota statis, atau variabel lokal statis yang dapat ditandai dengan __declspec(appdomain). Ini adalah kesalahan untuk diterapkan __declspec(appdomain) pada anggota statis dari jenis terkelola karena mereka selalu memiliki perilaku ini.

Penggunaan __declspec(appdomain) mirip dengan menggunakan Thread Local Storage (TLS). Utas memiliki penyimpanannya sendiri, seperti halnya domain aplikasi. Menggunakan __declspec(appdomain) memastikan variabel global memiliki penyimpanannya sendiri di setiap domain aplikasi yang dibuat untuk aplikasi ini.

Ada batasan untuk mencampur penggunaan per proses dan variabel per appdomain; lihat proses untuk informasi selengkapnya.

Misalnya, saat program dimulai, semua variabel per proses diinisialisasi, maka semua variabel per appdomain diinisialisasi. Oleh karena itu ketika variabel per proses sedang diinisialisasi, variabel tidak dapat bergantung pada nilai variabel domain per aplikasi apa pun. Adalah praktik buruk untuk mencampur penggunaan (penugasan) per appdomain dan variabel per proses.

Untuk informasi tentang cara memanggil fungsi di domain aplikasi tertentu, lihat fungsi call_in_appdomain.

Contoh

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

Baca juga

__declspec
Kata kunci