Bagikan melalui


Domain aplikasi

Catatan

Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.

Sistem operasi dan lingkungan runtime biasanya menyediakan beberapa bentuk isolasi antara aplikasi. Misalnya, Windows menggunakan proses untuk mengisolasi aplikasi. Isolasi ini diperlukan untuk memastikan bahwa kode yang berjalan dalam satu aplikasi tidak dapat berdampak buruk pada aplikasi lain yang tidak terkait.

Domain aplikasi menyediakan batas isolasi untuk keamanan, keandalan, dan versi, dan untuk membongkar rakitan. Domain aplikasi biasanya dibuat oleh host runtime, yang bertanggung jawab untuk bootstrap runtime bahasa umum sebelum aplikasi dijalankan.

Manfaat mengisolasi aplikasi

Secara historis, batas proses telah digunakan untuk mengisolasi aplikasi yang berjalan pada komputer yang sama. Setiap aplikasi dimuat ke dalam proses terpisah, yang mengisolasi aplikasi dari aplikasi lain yang berjalan di komputer yang sama.

Aplikasi diisolasi karena alamat memori adalah relatif proses; penunjuk memori yang diteruskan dari satu proses ke proses lainnya tidak dapat digunakan dengan cara apa pun yang berarti dalam proses target. Selain itu, Anda tidak dapat melakukan panggilan langsung antara dua proses. Sebagai gantinya, Anda tidak dapat melakukan panggilan langsung antara dua proses.

Kode yang dikelola harus diteruskan proses verifikasi sebelum dapat dijalankan (kecuali jika administrator telah memberikan izin untuk melewati verifikasi). Proses verifikasi menentukan apakah kode dapat mencoba mengakses alamat memori yang tidak valid atau melakukan tindakan lain yang dapat menyebabkan proses yang dijalankan gagal beroperasi dengan benar. Kode yang lolos uji verifikasi dikatakan aman untuk jenis. Kemampuan untuk memverifikasi kode sebagai jenis aman memungkinkan runtime bahasa umum untuk memberikan tingkat isolasi yang sama besarnya dengan batas proses, dengan biaya performa yang jauh lebih rendah.

Domain aplikasi menyediakan unit pemrosesan yang lebih aman dan serbaguna yang dapat digunakan runtime bahasa umum untuk menyediakan isolasi antar aplikasi. Anda dapat menjalankan beberapa domain aplikasi dalam satu proses dengan tingkat isolasi yang sama yang akan ada dalam proses terpisah, tetapi tanpa menimbulkan biaya tambahan untuk melakukan panggilan lintas proses atau beralih antar proses. Kemampuan untuk menjalankan beberapa aplikasi dalam satu proses secara dramatis meningkatkan skalabilitas server.

Mengisolasi aplikasi juga penting untuk keamanan aplikasi. Misalnya, Anda dapat menjalankan kontrol dari beberapa aplikasi Web dalam proses browser tunggal sedemikian rupa sehingga kontrol tidak dapat mengakses data dan sumber daya satu sama lain.

Isolasi yang disediakan oleh domain aplikasi memiliki manfaat sebagai berikut:

  • Kesalahan dalam satu aplikasi tidak dapat memengaruhi aplikasi lain. Karena kode jenis-aman tidak dapat menyebabkan kesalahan memori, menggunakan domain aplikasi memastikan bahwa kode yang berjalan di satu domain tidak dapat mempengaruhi aplikasi lain dalam proses.

  • Aplikasi individu dapat dihentikan tanpa menghentikan seluruh proses. Menggunakan domain aplikasi memungkinkan Anda untuk membongkar kode yang berjalan dalam satu aplikasi.

    Catatan

    Anda tidak dapat membongkar rakitan atau jenis individual. Hanya domain lengkap yang dapat dibongkar.

  • Kode yang berjalan dalam satu aplikasi tidak dapat secara langsung mengakses kode atau sumber daya dari aplikasi lain. Runtime bahasa umum memberlakukan isolasi ini dengan mencegah panggilan langsung antara objek dalam domain aplikasi yang berbeda. Objek yang melewati antara domain disalin atau diakses oleh proxy. Jika objek disalin, panggilan ke objek bersifat lokal. Artinya, pemanggil dan objek yang direferensikan berada dalam domain aplikasi yang sama. Jika objek diakses melalui proksi, panggilan ke objek bersifat jarak jauh. Dalam hal ini, pemanggil dan objek yang direferensikan berada dalam domain aplikasi yang berbeda. Panggilan lintas domain menggunakan infrastruktur panggilan jarak jauh yang sama dengan panggilan antara dua proses atau antara dua mesin. Dengan demikian, metadata untuk objek yang direferensikan harus tersedia untuk kedua domain aplikasi agar pemanggilan metode dapat dikompilasi JIT dengan benar. Jika domain pemanggil tidak memiliki akses ke metadata untuk objek yang dipanggil, kompilasi mungkin akan gagal dengan pengecualian jenis FileNotFoundException. Untuk informasi lebih lanjut, lihat Objek Jarak Jauh. Mekanisme untuk menentukan bagaimana objek dapat diakses di seluruh domain ditentukan oleh objek. Untuk informasi selengkapnya, lihat System.MarshalByRefObject .

  • Perilaku kode dicakup oleh aplikasi yang menjalankannya. Dengan kata lain, domain aplikasi menyediakan pengaturan konfigurasi seperti kebijakan versi aplikasi, lokasi rakitan jarak jauh yang diaksesnya, dan informasi tentang lokasi rakitan yang dimuat ke dalam domain.

  • Izin yang diberikan ke kode dapat dikontrol oleh domain aplikasi tempat kode dijalankan.

Domain dan rakitan aplikasi

Bagian ini menjelaskan hubungan antara domain aplikasi dan rakitan. Anda harus memuat rakitan ke domain aplikasi sebelum Anda dapat menjalankan kode yang dikandungnya. Menjalankan aplikasi umum dapat menyebabkan beberapa rakitan dimuat ke domain aplikasi.

Cara perakitan dimuat menentukan apakah kode yang dikompilasi just-in-time (JIT) dapat dibagikan oleh beberapa domain aplikasi dalam proses, dan apakah perakitan dapat dibongkar dari proses.

  • Jika rakitan dimuat domain-netral, semua domain aplikasi yang berbagi set pemberian keamanan yang sama dapat berbagi kode yang dikompilasi JIT yang sama, yang mengurangi memori yang dibutuhkan oleh aplikasi. Namun, perakitan tidak pernah dapat dibongkar dari proses.

  • Jika rakitan tidak dimuat domain-netral, itu harus dikompilasi JIT di setiap domain aplikasi tempatnya dimuat. Namun, perakitan dapat diturunkan dari proses dengan membongkar semua domain aplikasi yang dimuat.

Host runtime menentukan apakah akan memuat rakitan sebagai domain-netral saat memuat runtime ke dalam proses. Untuk aplikasi terkelola, terapkan atribut LoaderOptimizationAttribute ke metode titik masuk untuk proses tersebut, dan tentukan nilai dari LoaderOptimization enumerasi yang terkait. Untuk aplikasi tidak terkelola yang menghosting runtime bahasa umum, tentukan tanda yang sesuai saat Anda memanggil metode Fungsi CorBindToRuntimeEx.

Ada tiga opsi untuk memuat rakitan domain-netral:

  • LoaderOptimization.SingleDomain tidak memuat rakitan sebagai domain-netral, kecuali Mscorlib, yang selalu dimuat domain-netral. Pengaturan ini disebut domain tunggal karena biasanya digunakan ketika host hanya menjalankan satu aplikasi dalam proses.

  • LoaderOptimization.MultiDomain memuat semua rakitan sebagai domain-netral. Gunakan pengaturan ini ketika terdapat beberapa domain aplikasi dalam proses, yang semuanya menjalankan kode yang sama.

  • LoaderOptimization.MultiDomainHost memuat rakitan bernama yang kuat sebagai domain-netral, jika rakitan dan semua dependensinya telah dipasang di cache rakitan global. Rakitan lain dimuat dan dikompilasi JIT secara terpisah untuk setiap domain aplikasi tempatnya dimuat, dan dengan demikian dapat dibongkar dari proses. Gunakan pengaturan ini saat menjalankan lebih dari satu aplikasi dalam proses yang sama, atau jika Anda memiliki campuran rakitan yang digunakan bersama oleh banyak domain aplikasi dan rakitan yang perlu dibongkar dari proses.

Kode yang dikompilasi JIT tidak dapat dibagikan untuk rakitan yang dimuat ke dalam konteks muat ke, menggunakan metode LoadFrom dari kelas Assembly, atau dimuat dari gambar menggunakan kelebihan beban metode Load yang menentukan array byte.

Rakitan yang telah dikompilasi ke kode asli dengan menggunakan Ngen.exe (Pembuat Gambar Asli) dapat dibagi antara domain aplikasi, jika mereka dimuat domain-netral saat pertama kali dimuat ke dalam suatu proses.

Kode yang dikompilasi JIT untuk rakitan yang berisi titik masuk aplikasi dibagikan hanya jika semua dependensinya dapat dibagikan.

Rakitan domain-netral dapat dikompilasi JIT lebih dari sekali. Misalnya, ketika set pemberian keamanan dari dua domain aplikasi berbeda, mereka tidak dapat berbagi kode kompilasi JIT yang sama. Namun, setiap salinan rakitan yang dikompilasi JIT dapat dibagikan dengan domain aplikasi lain yang memiliki set pemberian yang sama.

Saat Anda memutuskan apakah akan memuat rakitan sebagai domain-netral, Anda harus membuat tradeoff antara mengurangi penggunaan memori dan faktor performa lainnya.

  • Akses ke data dan metode statis lebih lambat untuk rakitan domain-netral karena kebutuhan untuk mengisolasi rakitan. Setiap domain aplikasi yang mengakses rakitan harus memiliki salinan terpisah dari data statik, untuk mencegah referensi ke objek di bidang statik melintasi batas domain. Akibatnya, runtime berisi logika tambahan untuk mengarahkan pemanggil ke salinan yang sesuai dari data atau metode statik. Logika ekstra ini memperlambat panggilan.

  • Semua dependensi rakitan harus ditempatkan dan dimuat saat rakitan dimuat domain-netral, karena dependensinya yang tidak dapat dimuat domain-netral mencegah rakitan dimuat domain-netral.

Domain dan rangkaian aplikasi

Domain aplikasi membentuk batas isolasi untuk keamanan, pembuatan versi, keandalan, dan pembongkaran kode terkelola. Rangkaian adalah konstruksi sistem operasi yang digunakan oleh runtime bahasa umum untuk mengeksekusi kode. Saat dijalankan, semua kode terkelola dimuat ke domain aplikasi dan dijalankan oleh satu atau beberapa rangkaian terkelola.

Tidak ada korelasi satu-ke-satu antara domain aplikasi dan rangkaian. Beberapa rangkaian dapat dijalankan dalam satu domain aplikasi pada waktu tertentu, dan rangkaian tertentu tidak terbatas pada satu domain aplikasi. Artinya, rangkaian bebas melintasi batas domain aplikasi; rangkaian baru tidak dibuat untuk setiap domain aplikasi.

Pada waktu tertentu, setiap rangkaian dijalankan dalam domain aplikasi. Nol, satu, atau beberapa rangkaian mungkin dijalankan di domain aplikasi apa pun. Runtime melacak rangkaian mana yang berjalan di domain aplikasi mana. Anda dapat menemukan domain tempat rangkaian dijalankan kapan saja dengan memanggil metode Thread.GetDomain.

Domain dan budaya aplikasi

Budaya, yang diwakili oleh objek CultureInfo, dikaitkan dengan rangkaian. Anda bisa mendapatkan budaya yang terkait dengan rangkaian yang sedang dijalankan dengan menggunakan properti CultureInfo.CurrentCulture, dan Anda bisa mendapatkan atau mengatur budaya yang terkait dengan rangkaian yang sedang dijalankan dengan menggunakan properti Thread.CurrentCulture. Jika budaya yang terkait dengan rangkaian telah ditetapkan secara eksplisit dengan menggunakan properti Thread.CurrentCulture, budaya tersebut terus dikaitkan dengan rangkaian tersebut saat rangkaian melintasi batas domain aplikasi. Jika tidak, budaya yang terkait dengan rangkaian pada waktu tertentu ditentukan oleh nilai properti CultureInfo.DefaultThreadCurrentCulture di domain aplikasi tempat rangkaian dijalankan:

  • Jika nilai properti bukan null, budaya yang dikembalikan oleh properti dikaitkan dengan rangkaian (dan karenanya dikembalikan oleh properti Thread.CurrentCulture dan CultureInfo.CurrentCulture).

  • Jika nilai properti adalah null, budaya sistem saat ini dikaitkan dengan rangkaian.

Pemrograman dengan domain aplikasi

Domain aplikasi biasanya dibuat dan dimanipulasi secara terprogram oleh host runtime. Namun, terkadang program aplikasi mungkin juga ingin bekerja dengan domain aplikasi. Misalnya, program aplikasi dapat memuat komponen aplikasi ke dalam domain untuk dapat membongkar domain (dan komponen) tanpa harus menghentikan seluruh aplikasi.

AppDomain adalah antarmuka terprogram ke domain aplikasi. Kelas ini mencakup metode untuk membuat dan membongkar domain, membuat instans jenis di domain, dan mendaftar untuk berbagai pemberitahuan seperti pembongkaran domain aplikasi. Tabel berikut mencantumkan metode AppDomain yang paling sering digunakan.

Metode AppDomain Deskripsi
CreateDomain Membuat domain aplikasi baru. Disarankan agar Anda menggunakan kelebihan beban metode ini yang menetapkan objek AppDomainSetup. Ini adalah cara yang lebih disukai untuk mengatur properti domain baru, seperti basis aplikasi, atau direktori akar untuk aplikasi; lokasi file konfigurasi untuk domain; dan jalur penelusuran yang digunakan runtime bahasa umum untuk memuat rakitan ke domain.
ExecuteAssembly dan ExecuteAssemblyByName Menjalankan rakitan di domain aplikasi. Ini adalah metode instans, sehingga dapat digunakan untuk mengeksekusi kode di domain aplikasi lain yang menjadi referensi Anda.
CreateInstanceAndUnwrap Membuat instans dari jenis tertentu dalam domain aplikasi, dan mengembalikan proksi. Gunakan metode ini untuk menghindari memuat rakitan yang berisi jenis yang dibuat ke dalam rakitan pemanggil.
Unload Melakukan penonaktifan domain dengan baik. Domain aplikasi tidak dibongkar sampai semua rangkaian yang berjalan di domain telah berhenti atau tidak lagi berada di domain.

Catatan

Runtime bahasa umum tidak mendukung serialisasi metode global, sehingga delegasi tidak dapat digunakan untuk menjalankan metode global di domain aplikasi lain.

Antarmuka tidak terkelola yang dijelaskan dalam Spesifikasi Antarmuka Hosting runtime bahasa umum juga menyediakan akses ke domain aplikasi. Host runtime dapat menggunakan antarmuka dari kode yang tak terkelola untuk membuat dan mendapatkan akses ke domain aplikasi dalam suatu proses.

Variabel lingkungan COMPLUS_LoaderOptimization

Variabel lingkungan yang menetapkan kebijakan pengoptimalan loader default dari aplikasi yang dapat dijalankan.

Sintaks

COMPLUS_LoaderOptimization = 1

Keterangan

Aplikasi umum memuat beberapa rakitan ke dalam domain aplikasi sebelum kode yang dikandungnya dapat dijalankan.

Cara rakitan dimuat menentukan apakah kode yang dikompilasi just-in-time (JIT) dapat dibagikan oleh beberapa domain aplikasi dalam proses.

  • Jika rakitan dimuat domain-netral, semua domain aplikasi yang berbagi set pemberian keamanan yang sama dapat berbagi kode yang dikompilasi JIT yang sama. Ini mengurangi memori yang dibutuhkan oleh aplikasi.

  • Jika rakitan tidak dimuat domain-netral, itu harus dikompilasi JIT di setiap domain aplikasi tempatnya dimuat dan pemuat tidak boleh berbagi sumber daya internal di seluruh domain aplikasi.

Jika diatur ke 1, bendera lingkungan COMPLUS_LoaderOptimization memaksa host runtime untuk memuat semua rakitan dengan cara non-domain-netral yang dikenal sebagai SingleDomain. SingleDomain tidak memuat rakitan sebagai domain-netral, kecuali Mscorlib, yang selalu dimuat domain-netral. Pengaturan ini disebut domain tunggal karena biasanya digunakan ketika host hanya menjalankan satu aplikasi dalam proses.

Perhatian

Bendera lingkungan COMPLUS_LoaderOptimization dirancang untuk digunakan dalam skenario diagnostik dan pengujian. Mengaktifkan bendera dapat menyebabkan pelambatan parah dan peningkatan penggunaan memori.

Contoh kode

Untuk memaksa semua rakitan agar tidak dimuat sebagai domain-netral untuk layanan IISADMIN dapat dicapai dengan menambahkan COMPLUS_LoaderOptimization=1 ke Nilai Multi-String Lingkungan di kunci HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN.

Key = HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN
Name = Environment
Type = REG_MULTI_SZ
Value (to append) = COMPLUS_LoaderOptimization=1

Lihat juga