Bagikan melalui


Eksekusi Berdampingan dalam .NET Framework

Nota

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, pada komputer yang sama secara bersamaan.

Ilustrasi berikut menunjukkan beberapa aplikasi menggunakan dua versi runtime yang berbeda pada komputer yang sama. Aplikasi A, B, dan C menggunakan runtime versi 1.0, sementara aplikasi D menggunakan runtime 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 dan rakitan .NET Framework di-versi secara terpisah. Misalnya, versi 4.0 dari runtime 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 diikat aplikasi, dan lebih banyak kontrol atas versi runtime mana yang digunakan aplikasi.

Manfaat Pelaksanaan Berdampingan

Sebelum Windows XP dan .NET Framework, terjadi konflik DLL karena aplikasi tidak dapat membedakan antara versi kode yang sama yang tidak kompatibel. Tipe 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 aplikasi. Akibatnya, versi baru komponen dapat menimpa versi lama dan mengganggu fungsi aplikasi.

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

  • Assemblies dengan nama kuat.

    Eksekusi berdampingan menggunakan rakitan dengan nama kuat untuk mengikat informasi tipe ke versi tertentu dari sebuah rakitan. Ini mencegah aplikasi atau komponen untuk terikat ke versi assembly yang tidak valid. Rakitan yang memiliki nama kuat memungkinkan beberapa versi file untuk ada di komputer yang sama dan dapat digunakan oleh aplikasi. Untuk informasi selengkapnya, lihat Strong-Named Assembly.

  • Penyimpanan kode sadar versi.

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

  • Isolasi.

    Dengan menggunakan .NET Framework, Anda dapat membuat aplikasi dan komponen yang dijalankan dalam isolasi. Isolasi adalah komponen penting dari eksekusi berdampingan. Ini melibatkan mengetahui sumber daya yang Anda gunakan dan berbagi sumber daya dengan percaya diri di antara beberapa versi aplikasi atau komponen. Isolasi juga mencakup penyimpanan file dengan cara yang spesifik terhadap 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 dibangun 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, perhatikan bahwa fitur API yang ditambahkan dalam versi 1.1 dari .NET Framework tidak akan berfungsi dengan .NET Framework versi 1.0. 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 dan rakitan .NET Framework terkait (konsep yang disebut sebagai penyatuan perakitan). Anda dapat mengarahkan ulang pengikatan rakitan untuk menyertakan rakitan lain dari .NET Framework, tetapi mengganti pengikatan rakitan default dapat berisiko dan harus diuji secara ketat sebelum penyebaran.

Menemukan Informasi Versi Runtime

Informasi tentang versi runtime mana aplikasi atau komponen dikompilasi dengan dan versi runtime mana yang diperlukan aplikasi untuk dijalankan disimpan di dua lokasi. Ketika aplikasi atau komponen dikompilasi, informasi tentang versi runtime yang digunakan untuk mengkompilasinya disimpan dalam eksekusi terkelola. Informasi tentang versi runtime yang diperlukan aplikasi atau komponen disimpan dalam file konfigurasi aplikasi.

Informasi Versi Runtime dalam Managed Executable

Header file portabel yang dapat dieksekusi (PE) dari setiap aplikasi dan komponen terkelola berisi informasi tentang versi runtime yang dibangunnya. Common Language Runtime menggunakan informasi ini untuk menentukan versi runtime yang paling tepat yang dibutuhkan aplikasi untuk dijalankan.

Informasi Versi Runtime dalam File Konfigurasi Aplikasi

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

Kode yang tidak dikelola, termasuk aplikasi COM dan COM+, dapat memiliki file konfigurasi aplikasi yang digunakan runtime untuk berinteraksi dengan kode terkelola. File konfigurasi aplikasi memengaruhi kode terkelola apa pun yang Anda aktifkan melalui COM. File dapat menentukan versi runtime mana yang didukungnya, serta pengalihan asembli. Secara default, aplikasi interop COM yang memanggil ke kode terkelola menggunakan versi terbaru runtime yang diinstal di komputer.

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

Menentukan Versi Runtime mana yang akan Dimuat

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

  • Versi runtime yang tersedia.

  • Versi runtime yang didukung aplikasi.

Versi Runtime yang Didukung

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

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

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

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

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

    Nota

    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 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 untuk aplikasi yang berjalan dalam konteks pengguna tertentu.

Nota

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

Nama Majelis yang Memenuhi Syarat Sebagian dan Eksekusi Paralel

Karena mereka adalah sumber potensial masalah berdampingan, referensi perakitan yang memenuhi syarat sebagian hanya dapat digunakan untuk mengikat rakitan dalam direktori aplikasi. Hindari referensi rakitan yang setengah memenuhi syarat 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. <qualifyAssembly> Gunakan elemen untuk menentukan hanya bidang yang tidak diatur dalam referensi parsial. Identitas rakitan yang tercantum dalam fullName atribut harus berisi semua informasi yang diperlukan untuk sepenuhnya memenuhi syarat nama rakitan: nama rakitan, kunci publik, budaya, dan versi.

Contoh berikut menunjukkan entri file konfigurasi aplikasi untuk sepenuhnya memenuhi syarat assembly 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 beban rakitan mereferensikan myAssembly, pengaturan file konfigurasi ini menyebabkan runtime secara otomatis menerjemahkan referensi yang memenuhi syarat myAssembly sebagian ke referensi yang sepenuhnya memenuhi syarat. Misalnya, Assembly.Load("myAssembly") menjadi Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=netral").

Nota

Anda dapat menggunakan metode LoadWithPartialName untuk melewati pembatasan Common Language Runtime (runtime bahasa umum) yang melarang rakitan dengan referensi parsial dimuat dari cache rakitan global. Metode ini harus digunakan hanya dalam situasi jarak jauh karena dapat dengan mudah menyebabkan masalah dalam eksekusi paralel.

Judul Deskripsi
Panduan: Aktifkan dan Nonaktifkan Pengalihan Pengikatan Otomatis Menjelaskan cara mengikat aplikasi ke versi perakitan tertentu.
Mengonfigurasi Pengalihan Pengikatan Rakitan Menjelaskan cara mengalihkan referensi pengikatan rakitan ke versi tertentu dari rakitan .NET Framework.
In-Process Eksekusi Berdampingan Membahas bagaimana Anda dapat menggunakan aktivasi host runtime berdampingan di dalam suatu proses untuk menjalankan beberapa versi CLR secara bersamaan dalam satu proses.
Rakitan dalam .NET Memberikan gambaran umum konseptual rakitan.
Domain Aplikasi Memberikan gambaran umum konseptual domain aplikasi.

Referensi

<elemen supportedRuntime>