Bagikan melalui


Domain aplikasi

Nota

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 antar 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, pengelolaan versi, dan untuk pemuatan dan pembongkaran rakitan. Domain aplikasi biasanya dibuat oleh host runtime, yang bertanggung jawab untuk menginisialisasi runtime bahasa umum sebelum aplikasi dijalankan.

Manfaat mengisolasi aplikasi

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

Aplikasi terisolasi karena alamat memori relatif proses; pointer memori yang diteruskan dari satu proses ke proses lain tidak dapat digunakan dengan cara yang bermakna dalam proses target. Selain itu, Anda tidak dapat melakukan panggilan langsung di antara dua proses. Sebagai gantinya, Anda harus menggunakan proksi, yang memberikan tingkat keterhubungan tidak langsung.

Kode terkelola harus diteruskan melalui proses verifikasi sebelum dapat dijalankan (kecuali administrator telah memberikan izin untuk melewati verifikasi). Proses verifikasi menentukan apakah kode dapat mencoba mengakses alamat memori yang tidak valid atau melakukan beberapa tindakan lain yang dapat menyebabkan proses di mana kode berjalan gagal beroperasi dengan benar. Kode yang lolos tes verifikasi dikatakan berjenis aman. Kemampuan untuk memverifikasi kode sebagai jenis aman memungkinkan runtime bahasa umum untuk menyediakan 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 overhead 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 satu proses browser-sehingga kontrol tidak dapat mengakses data dan sumber daya satu sama lain.

Isolasi yang disediakan oleh domain aplikasi memiliki manfaat berikut:

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

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

    Nota

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

  • Kode yang berjalan dalam satu aplikasi tidak dapat langsung mengakses kode atau sumber daya dari aplikasi lain. Runtime bahasa umum memberlakukan isolasi ini dengan mencegah panggilan langsung antar objek di domain aplikasi yang berbeda. Objek yang melintasi antar domain disalin atau diakses oleh proksi. Jika objek disalin, panggilan ke objek bersifat lokal. Artinya, pemanggil dan objek yang dirujuk berada di domain aplikasi yang sama. Jika objek diakses melalui proksi, panggilan ke objek dilakukan dari jarak jauh. Dalam hal ini, pemanggil dan objek yang dirujuk berada di domain aplikasi yang berbeda. Panggilan lintas domain menggunakan infrastruktur panggilan jarak jauh yang sama dengan panggilan antara dua proses atau di antara dua komputer. Dengan demikian, metadata untuk objek yang dirujuk harus tersedia untuk kedua domain aplikasi untuk memungkinkan panggilan metode dikompilasi JIT dengan benar. Jika domain panggilan tidak memiliki akses ke metadata untuk objek yang dipanggil, kompilasi mungkin gagal dengan pengecualian jenis FileNotFoundException. Untuk informasi selengkapnya, 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 dilingkup oleh aplikasi tempat kode berjalan. Dengan kata lain, domain aplikasi menyediakan pengaturan konfigurasi seperti kebijakan versi aplikasi, lokasi rakitan jarak jauh yang diaksesnya, dan informasi tentang tempat menemukan rakitan yang dimuat ke domain.

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

Domain dan rakitan aplikasi

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

Cara pemuatan assembly menentukan apakah kode yang dikompilasi just-in-time (JIT) dapat dibagikan oleh beberapa domain aplikasi yang terlibat dalam proses, dan apakah assembly tersebut dapat diturunkan dari proses.

  • Jika assembly dimuat secara domain-netral, kode yang dikompilasi JIT yang sama dapat dibagi oleh semua domain aplikasi yang memiliki set izin keamanan yang sama, sehingga mengurangi memori yang diperlukan oleh aplikasi. Namun, rakitan tidak pernah dapat dibongkar dari proses.

  • Jika assembly tidak dimuat domain-netral, itu harus dikompilasi JIT di setiap domain aplikasi di mana ia dimuat. Namun, assembly dapat dikeluarkan dari proses dengan membongkar semua domain aplikasi tempat assembly dimuat.

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

Ada tiga opsi untuk memuat himpunan yang netral terhadap domain.

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

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

  • LoaderOptimization.MultiDomainHost memuat assembly dengan nama yang kuat sebagai netral domain, jika assembly tersebut dan semua dependensinya telah diinstal di cache assembly global. Rakitan lain dimuat dan dikompilasi JIT secara terpisah untuk setiap domain aplikasi tempat mereka dimuat, dan dengan demikian dapat dibongkar dari proses. Gunakan pengaturan ini ketika 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 dikeluarkan dari proses.

Kode yang dikompilasi JIT tidak dapat dibagikan untuk rakitan yang dimuat ke dalam konteks load-from, menggunakan metode LoadFrom dari kelas Assembly, atau dimuat dari gambar menggunakan overload Load yang menentukan array byte.

Assemblies yang telah dikompilasi ke kode asli dengan menggunakan Ngen.exe (Native Image Generator) dapat dibagikan antara domain aplikasi, jika dimuat sebagai domain-neutral saat pertama kali dimuat ke dalam proses.

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

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

Ketika Anda memutuskan apakah akan memuat assembly sebagai domain-netral, Anda harus melakukan kompromi dalam mengurangi penggunaan memori dengan faktor performa lainnya.

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

  • Semua dependensi assembly harus ditemukan dan dimuat secara domain-netral ketika assembly dimuat, karena dependensi yang tidak dapat dimuat secara domain-netral akan mencegah assembly untuk dimuat domain-netral.

Domain aplikasi dan proses

Domain aplikasi membentuk batas isolasi untuk keamanan, penerapan versi, keandalan, dan pembongkaran kode terkelola. Thread adalah komponen sistem operasi yang digunakan oleh Common Language Runtime untuk menjalankan kode. Pada runtime, semua kode yang terkelola dimuat ke dalam domain aplikasi dan dijalankan oleh satu atau beberapa utas terkelola.

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

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

Domain dan budaya aplikasi

Kultur, yang diwakili oleh objek CultureInfo, dikaitkan dengan utas. Anda bisa mendapatkan budaya yang terkait dengan utas yang sedang dijalankan dengan menggunakan properti CultureInfo.CurrentCulture, dan Anda bisa mengambil atau menetapkan budaya yang terkait dengan utas yang sedang dijalankan dengan menggunakan properti Thread.CurrentCulture. Jika budaya yang diasosiasikan dengan sebuah utas telah diatur secara eksplisit dengan menggunakan properti Thread.CurrentCulture, budaya tersebut akan terus dikaitkan dengan utas ketika utas melewati batas domain aplikasi. Jika tidak, budaya yang terkait dengan utas pada waktu tertentu ditentukan oleh nilai CultureInfo.DefaultThreadCurrentCulture properti di domain aplikasi tempat utas dijalankan:

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

  • Jika nilai properti adalah null, lokalisasi sistem saat ini dihubungkan dengan thread.

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 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 tipe di domain, serta mendaftar guna bermacam-macam pemberitahuan seperti pembongkaran domain aplikasi. Tabel berikut ini mencantumkan metode yang umum digunakan AppDomain .

Metode AppDomain Deskripsi
CreateDomain Membuat domain aplikasi baru. Disarankan agar Anda menggunakan overload dari metode ini yang menentukan objek AppDomainSetup. Ini adalah cara yang paling diutamakan untuk mengatur properti dari sebuah domain baru, seperti basis aplikasi atau direktori akar untuk aplikasi; lokasi file konfigurasi untuk domain; dan jalur pencarian yang digunakan runtime bahasa umum untuk memuat rakitan ke dalam domain.
ExecuteAssembly dan ExecuteAssemblyByName Menjalankan assembly di domain aplikasi. Ini adalah metode instans, sehingga dapat digunakan untuk menjalankan kode di domain aplikasi lain tempat Anda memiliki referensi.
CreateInstanceAndUnwrap Membuat objek dari jenis tertentu di domain aplikasi, dan mengembalikan proksi. Gunakan metode ini untuk menghindari pemuatan rakitan yang berisi tipe yang dibuat ke dalam rakitan pemanggil.
Unload Melakukan penonaktifan domain secara tertib. Domain aplikasi tidak dilepas sampai semua utas yang berjalan di domain berhenti atau tidak lagi berada di domain.

Nota

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 tidak dikelola untuk membuat dan mendapatkan akses ke domain aplikasi dalam proses.

Variabel lingkungan sistem COMPLUS_LoaderOptimization

Variabel lingkungan yang mengatur kebijakan pengoptimalan pemuat default dari aplikasi yang dapat dieksekusi.

Sintaksis

COMPLUS_LoaderOptimization = 1

Komentar

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

Cara pemuatan assembly menentukan apakah kode yang dikompilasi secara just-in-time (JIT) dapat dibagikan oleh beberapa domain aplikasi dalam prosedur operasi.

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

  • Jika sebuah assembly tidak dimuat secara netral-domain, maka itu harus dikompilasi JIT di setiap domain aplikasi tempat ia dimuat, dan pemuat tidak boleh berbagi sumber daya internal antar domain aplikasi.

Ketika diatur ke 1, bendera lingkungan COMPLUS_LoaderOptimization memaksa host runtime memuat semua rakitan dengan cara non-domain-netral yang dikenal sebagai SingleDomain. SingleDomain memuat tidak ada rakitan sebagai domain-netral, kecuali Mscorlib, yang selalu dimuat domain-netral. Pengaturan ini disebut domain tunggal karena umumnya 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 perlambatan yang parah dan peningkatan penggunaan memori.

Contoh kode

Untuk memaksa semua assembly 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