Bagikan melalui


Eksekusi Berdampingan di .NET Framework

Catatan

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

Eksekusi berdampingan adalah kemampuan untuk menjalankan beberapa versi aplikasi atau komponen pada komputer yang sama. Anda dapat memiliki beberapa versi runtime bahasa umum, dan beberapa versi aplikasi dan komponen yang menggunakan versi runtime bahasa umum, pada komputer yang sama secara bersamaan.

Ilustrasi berikut menunjukkan beberapa aplikasi menggunakan dua versi runtime bahasa umum yang berbeda di komputer yang sama. Aplikasi A, B, dan C menggunakan runtime bahasa umum versi 1.0, sementara aplikasi D menggunakan runtime bahasa umum versi 1.1.

Eksekusi berdampingan dari versi runtime yang berbeda,

.NET Framework terdiri dari runtime bahasa umum dan kumpulan rakitan yang berisi jenis API. Runtime bahasa umum dan rakitan .NET Framework diversikan secara terpisah. Misalnya, versi 4.0 dari runtime bahasa umum sebenarnya adalah versi 4.0.319, sedangkan versi 1.0 dari rakitan .NET Framework adalah versi 1.0.3300.0.

Ilustrasi berikut menunjukkan beberapa aplikasi menggunakan dua versi komponen yang berbeda pada komputer yang sama. Aplikasi A dan B menggunakan komponen versi 1.0 sementara Aplikasi C menggunakan versi 2.0 dari komponen yang sama.

Diagram yang memperlihatkan eksekusi komponen secara berdampingan.

Eksekusi berdampingan memberi Anda lebih banyak kontrol atas versi komponen mana yang mengikat aplikasi, dan lebih banyak kontrol atas versi runtime bahasa umum mana yang digunakan aplikasi.

Keuntungan Eksekusi Berdampingan

Sebelum Windows XP dan .NET Framework, terjadi konflik DLL karena aplikasi tidak dapat membedakan antara versi kode yang sama yang tidak kompatibel. Jenis informasi yang terkandung dalam DLL hanya terikat ke nama file. Aplikasi tidak memiliki cara untuk mengetahui apakah jenis yang terkandung dalam DLL adalah jenis yang sama dengan yang dibangun oleh aplikasi. Akibatnya, versi baru komponen dapat menimpa versi lama dan merusak aplikasi.

Eksekusi berdampingan dan .NET Framework menyediakan fitur berikut untuk menghilangkan konflik DLL:

  • Rakitan dengan nama yang kuat.

    Eksekusi berdampingan menggunakan rakitan bernama kuat untuk mengikat informasi jenis ke versi rakitan tertentu. Hal ini mencegah aplikasi atau komponen mengikat ke versi rakitan yang tidak valid. Rakitan bernama kuat juga memungkinkan beberapa versi file untuk ada di komputer yang sama dan digunakan oleh aplikasi. Untuk mengetahui informasi selengkapnya, lihat Rakitan Bernama Kuat.

  • Penyimpanan kode yang sadar versi.

    .NET Framework menyediakan penyimpanan kode sadar versi di singgahan perakitan global. Singgahan perakitan global adalah cache kode di seluruh komputer yang ada di semua komputer dengan .NET Framework terpasang. Singgahan rakitan global menyimpan rakitan berdasarkan informasi versi, budaya, penerbit, dan mendukung beberapa versi komponen dan aplikasi. Untuk informasi selengkapnya, lihat Cache Assembly Global.

  • Isolasi.

    Dengan menggunakan .NET Framework, Anda dapat membuat aplikasi dan komponen yang dijalankan dalam isolasi. Isolasi adalah komponen penting dari eksekusi berdampingan. Ini melibatkan pengetahuan sumber daya yang Anda gunakan dan berbagi sumber daya dengan keyakinan di antara beberapa versi aplikasi atau komponen. Isolasi juga mencakup penyimpanan file dengan cara khusus versi. Untuk informasi selengkapnya tentang isolasi, lihat Panduan Membuat Komponen untuk Eksekusi Berdampingan.

Kompatibilitas Versi

Versi 1.0 dan 1.1 dari .NET Framework dirancang agar kompatibel satu sama lain. Aplikasi yang dibuat dengan .NET Framework versi 1.0 harus berjalan pada versi 1.1, dan aplikasi yang dibangun dengan .NET Framework versi 1.1 harus berjalan pada versi 1.0. Namun tetap perhatikan bahwa fitur API yang ditambahkan dalam versi 1.1 dari .NET Framework tidak akan berfungsi dengan versi 1.0 dari .NET Framework. Aplikasi yang dibuat dengan versi 2.0 hanya akan berjalan pada versi 2.0. Aplikasi versi 2.0 tidak akan berjalan pada versi 1.1 atau yang lebih lama.

Versi .NET Framework diperlakukan sebagai satu unit yang terdiri dari runtime bahasa umum dan rakitan .NET Framework terkait (konsep yang disebut sebagai penyatuan rakitan). Anda dapat mengalihkan pengikatan perakitan untuk menyertakan versi rakitan .NET Framework lainnya, tetapi mengganti pengikatan rakitan default dapat berisiko dan harus diuji secara ketat sebelum penyebaran.

Menemukan Informasi Versi Runtime Bahasa Umum

Informasi tentang aplikasi atau komponen versi runtime bahasa umum yang dikompilasi dan aplikasi versi runtime bahasa umum yang diperlukan untuk dieksekusi disimpan di dua lokasi. Saat aplikasi atau komponen dikompilasi, informasi tentang versi runtime bahasa umum yang digunakan untuk mengompilasinya disimpan dalam eksekusi terkelola. Informasi tentang versi runtime bahasa umum yang diperlukan aplikasi atau komponen disimpan dalam file konfigurasi aplikasi.

Informasi Versi Runtime di Eksekusi Terkelola

Header file portable executable (PE) dari setiap aplikasi dan komponen terkelola berisi informasi tentang versi runtime bahasa umum yang dibangunnya. Runtime bahasa umum menggunakan informasi ini untuk menentukan versi runtime bahasa umum yang paling mungkin yang perlu dijalankan aplikasi.

Informasi Versi Runtime Bahasa Umum dalam File Konfigurasi Aplikasi

Selain informasi di header file PE, aplikasi dapat disebarkan dengan file konfigurasi aplikasi yang menyediakan informasi versi runtime bahasa umum. File konfigurasi aplikasi adalah file berbasis XML yang dibuat oleh pengembang aplikasi dan yang dikirim dengan aplikasi. Elemen <requiredRuntime> dari bagian <memulai>, jika ada dalam file ini, menentukan versi runtime bahasa umum mana dan versi komponen mana yang didukung aplikasi. Anda juga dapat menggunakan file ini dalam pengujian untuk menguji kompatibilitas aplikasi dengan versi runtime bahasa umum yang berbeda.

Kode tak terkelola, termasuk aplikasi COM dan COM+, dapat memiliki file konfigurasi aplikasi yang digunakan runtime bahasa umum untuk berinteraksi dengan kode terkendali. File konfigurasi aplikasi memengaruhi kode terkendali yang Anda aktifkan melalui COM. File dapat menentukan versi runtime bahasa umum mana yang didukungnya, serta pengalihan rakitan. Secara default, aplikasi interop COM memanggil ke kode terkendali menggunakan versi terbaru runtime bahasa umum yang dipasang di komputer.

Untuk informasi selengkapnya tentang file konfigurasi aplikasi, lihat Mengonfigurasi Aplikasi.

Menentukan Versi Runtime Bahasa Umum mana yang akan Dimuat

Runtime bahasa umum menggunakan informasi berikut untuk menentukan versi runtime bahasa umum mana yang akan dimuat untuk aplikasi:

  • Versi runtime bahasa umum yang tersedia.

  • Versi runtime bahasa umum yang didukung aplikasi.

Versi Runtime Bahasa Umum yang Didukung

Runtime bahasa umum menggunakan file konfigurasi aplikasi dan header file portable executable (PE) untuk menentukan versi runtime bahasa umum mana yang didukung aplikasi. Jika tidak ada file konfigurasi aplikasi, runtime bahasa umum memuat versi runtime bahasa umum yang ditentukan dalam header file PE aplikasi, jika versi tersebut tersedia.

Jika file konfigurasi aplikasi ada, runtime bahasa umum menentukan versi runtime bahasa umum yang sesuai untuk dimuat berdasarkan hasil proses berikut:

  1. Runtime bahasa umum memeriksa elemen <Elemen> supportedRuntime dalam file konfigurasi aplikasi. Jika satu atau beberapa versi runtime bahasa umum yang didukung, ditentukan dalam elemen<supportedRuntime> yang ada, runtime bahasa umum memuat versi runtime bahasa umum yang ditentukan oleh elemen <supportedRuntime> pertama. Jika versi ini tidak tersedia, runtime bahasa umum memeriksa elemen <supportedRuntime> berikutnya dan mencoba memuat versi runtime bahasa umum yang ditentukan. Jika versi runtime bahasa umum ini tidak tersedia, elemen <supportedRuntime> berikutnya akan diperiksa. Jika tidak ada versi runtime bahasa umum yang didukung yang tersedia, runtime bahasa umum gagal memuat versi runtime bahasa umum dan menampilkan pesan kepada pengguna (lihat langkah 3).

  2. Runtime bahasa umum membaca header file PE dari file yang dapat dieksekusi aplikasi. Jika versi runtime bahasa umum yang ditentukan oleh header file PE tersedia, runtime bahasa umum memuat versi tersebut. Jika versi runtime bahasa umum yang ditentukan tidak tersedia, runtime bahasa umum mencari versi runtime bahasa umum yang ditentukan oleh Microsoft agar kompatibel dengan versi runtime bahasa umum di header PE. Jika versi tersebut tidak ditemukan, proses berlanjut ke langkah 3.

  3. Runtime bahasa umum menampilkan pesan yang menyatakan bahwa versi runtime bahasa umum yang didukung oleh aplikasi tidak tersedia. Runtime bahasa umum tidak dimuat.

    Catatan

    Anda dapat menekan tampilan pesan ini dengan menggunakan nilai NoGuiFromShim di bawah kunci registri HKLM\Software\Microsoft\. NETFramework atau menggunakan variabel lingkungan COMPLUS_NoGuiFromShim. Misalnya, Anda dapat menekan pesan untuk aplikasi yang biasanya tidak berinteraksi dengan pengguna, seperti penginstalan tanpa pengawas atau layanan Windows. Ketika tampilan pesan ini ditekan, runtime bahasa umum menulis pesan ke log peristiwa. Atur nilai registri NoGuiFromShim ke 1 untuk menekan pesan ini untuk semua aplikasi di komputer. Secara bergantian, atur variabel lingkungan COMPLUS_NoGuiFromShim ke 1 untuk menekan pesan aplikasi yang berjalan dalam konteks pengguna tertentu.

Catatan

Setelah versi runtime bahasa umum dimuat, pengalihan pengikatan rakitan dapat menentukan bahwa versi rakitan .NET Framework individu yang berbeda dimuat. Pengalihan pengikatan ini hanya memengaruhi rakitan tertentu yang dialihkan.

Nama Rakitan yang Memenuhi Syarat Sebagian dan Eksekusi Berdampingan

Karena merupakan sumber potensial masalah berdampingan, referensi rakitan yang sebagian memenuhi syarat hanya dapat digunakan untuk mengikat rakitan dalam direktori aplikasi. Hindari referensi rakitan yang memenuhi syarat sebagian dalam kode Anda.

Untuk mengurangi referensi rakitan yang memenuhi syarat sebagian dalam kode, Anda dapat menggunakan elemen <qualifyAssembly> dalam file konfigurasi aplikasi untuk sepenuhnya memenuhi syarat referensi rakitan yang memenuhi syarat sebagian yang terjadi dalam kode. Gunakan elemen <qualifyAssembly> untuk menentukan hanya bidang yang tidak diatur dalam referensi parsial. Identitas rakitan yang tercantum dalam atribut fullName harus berisi semua informasi yang diperlukan untuk sepenuhnya memenuhi syarat nama rakitan: nama rakitan, kunci umum, budaya, dan versi.

Contoh berikut menunjukkan entri file konfigurasi aplikasi untuk sepenuhnya memenuhi syarat rakitan yang disebut myAssembly.

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="myAssembly"
fullName="myAssembly,
      version=1.0.0.0,
publicKeyToken=...,
      culture=neutral"/>
</assemblyBinding>

Setiap kali pernyataan pemuatan rakitan mereferensikan myAssembly, pengaturan file konfigurasi ini menyebabkan runtime bahasa umum secara otomatis menerjemahkan referensi myAssembly yang memenuhi syarat sebagian ke referensi yang sepenuhnya memenuhi syarat. Misalnya, Assembly.Load("myAssembly") menjadi Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral").

Catatan

Anda dapat menggunakan metode LoadWithPartialName untuk melewati pembatasan runtime bahasa umum yang melarang rakitan yang direferensikan sebagian dimuat dari cache rakitan global. Metode ini harus digunakan hanya dalam skenario jarak jauh karena dapat dengan mudah menyebabkan masalah dalam eksekusi berdampingan.

Judul Deskripsi
Cara: Mengaktifkan dan Menonaktifkan Pengalihan Pengikatan Otomatis Menjelaskan cara mengikat aplikasi ke versi rakitan tertentu.
Mengonfigurasi Pengalihan Pengikatan Rakitan Menjelaskan cara mengalihkan referensi pengikatan rakitan ke versi rakitan .NET Framework tertentu.
Eksekusi Berdampingan Dalam Proses Membahas bagaimana Anda dapat menggunakan aktivasi host runtime bahasa umum berdampingan untuk menjalankan beberapa versi runtime bahasa umum dalam satu proses.
Perakitan di .NET Memberikan gambaran umum konseptual rakitan.
Domain Aplikasi Memberikan gambaran konseptual dari domain aplikasi.

Referensi

<Elemen>supportedRuntime