Pengalihan Assembly Binding: Bagaimana dan Mengapa?


127

Ini bukan pertanyaan masalah tetapi pertanyaan pemahaman umum tentang cara kerja pengalihan pengikatan assembly.

Pertanyaan

  1. Mengapa pengalihan mengikat hanya menampilkan versi mayor dan bukan nomor minor, versi pembuatan dan revisi?
  2. Apakah versi lama dan versi baru hanya berubah jika ada perubahan pada versi mayor?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>

Itu bisa versi apa saja, bukan hanya yang utama. Misalnya:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Evk

@Evk: Semua contoh yang saya lihat hanya menunjukkan versi utama.
Nikhil Agrawal

4
Nah itu hanya contoh, dan tidak disebutkan di mana pun bahwa itu satu-satunya cara yang mungkin.
Evk

Jawaban:


166

Mengapa pengalihan yang mengikat diperlukan? Misalkan Anda memiliki aplikasi A yang mereferensikan library B, dan juga library C versi 1.1.2.5. Library B pada gilirannya juga mereferensikan library C, tetapi dari versi 1.1.1.0. Sekarang kami mengalami konflik, karena Anda tidak dapat memuat versi berbeda dari rakitan yang sama saat runtime. Untuk menyelesaikan konflik ini, Anda mungkin menggunakan pengalihan binding, biasanya ke versi baru (tetapi bisa juga ke versi lama). Anda melakukannya dengan menambahkan yang berikut ini ke file app.config dari aplikasi A, di bawah configuration > runtime > assemblyBindingbagian (lihat di sini untuk contoh file konfigurasi lengkap):

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

Anda juga dapat menentukan berbagai versi untuk dipetakan:

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

Sekarang pustaka B, yang telah dikompilasi dengan referensi ke C versi 1.1.1.0 akan menggunakan C versi 1.1.2.5 saat runtime. Tentu saja, Anda lebih baik memastikan bahwa library C kompatibel dengan versi sebelumnya atau hal ini dapat menyebabkan hasil yang tidak diharapkan.

Anda dapat mengarahkan ulang semua versi pustaka, tidak hanya yang utama.


File apa dan di bawah bagian apa ini masuk? Dapatkah seseorang memberikan tautan ke sumber seperti MSDN atau yang serupa untuk referensi? Ingat orang akan mendarat di artikel SO Q / A Anda dari seluruh bidang mesin pencari dan referensi sangat penting. Saya memiliki seorang rekan kerja yang memberitahu saya untuk "hanya menambahkan pengalihan perakitan ke file exe Anda" tepat sebelum pergi berlibur selama seminggu dan saya mendarat di sini dan sementara jawaban ini tampak hebat itu kurang konteks dan referensi.
tpartee

Pertanyaan yang valid @tpartee, saya telah mengedit jawabannya (menunggu tinjauan sejawat) untuk menyertakan bagian konfigurasi dan tautan ke docs.microsoft.com/en-us/dotnet/framework/configure-apps/…
Kobus Smit

1
@AlexanderDerck dalam file konfigurasi aplikasi A - mereka tidak berpengaruh (sejauh yang saya ketahui) di file konfigurasi pustaka, kecuali mungkin ketika pustaka ini adalah pustaka pengujian unit dan "dieksekusi" dalam arti tertentu oleh pelari pengujian unit.
Evk

1
@AlexanderDerck ada pertanyaan beberapa minggu lalu, dengan banyak suara positif dan bahkan hadiah, yang menanyakan hal itu, tetapi tidak ada yang bisa memberikan jawaban yang meyakinkan - stackoverflow.com/q/48377474/5311735
Evk

1
@CodeEngine publicKeyToken mengidentifikasi rakitan C. Hanya rakitan bertanda tangan yang memiliki token kunci publik yang mengidentifikasi mereka. Berikut adalah pertanyaan terkait tentang bagaimana Anda dapat mengetahui token yang diberikan bahwa Anda memiliki perakitan: stackoverflow.com/q/3045033/5311735
Evk

56

Kami menemukan masalah dengan pengalihan yang mengikat untuk NewtonSoft.Json. Kami mencari versi file di win 10 properti file "9.0.1.19813", mencari nomor tersebut dan pengalihan terus gagal. Penyelidikan lebih lanjut dan menemukan bahwa kami sedang melihat versi file dan bukan versi perakitan. Jadi, saya bertanya-tanya apakah orang salah mengira Versi File (yang sering berubah) dan versi Majelis (yang tidak dapat Anda lihat di Windows 10 File Explorer). Untuk melihat versi Assembly dari sebuah dll, Anda dapat menjalankannya di PowerShell. Ganti nama dll dengan yang ingin Anda cari versinya.

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

Hasil di atas adalah.

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

Lihat Referensi:

Bagaimana cara melihat versi rakitan rakitan .NET di Windows Vista dan yang lebih baru (Windows 7, 2008)?

https://support.microsoft.com/en-nz/help/556041

masukkan deskripsi gambar di sini


12
Suara positif untuk mengemukakan perbedaan antara versi File dan versi Perakitan !!
mrid
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.