Assembly Binding yönlendirmesi: Nasıl ve Neden?


127

Bu bir sorun sorusu değil, derleme bağlama yönlendirmesinin çalışmasına ilişkin genel bir anlayış sorusudur.

Sorguları

  1. Bağlayıcı yeniden yönlendirme neden yalnızca ana sürümü gösteriyor ve küçük, derleme ve revizyon numaralarını göstermiyor?
  2. Eski ve yeni sürüm sadece ana sürümde değişiklik olduğunda mı değişiyor?

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

Herhangi bir sürüm olabilir, yalnızca ana sürüm değil. Örneğin:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Evk

@Evk: Gördüğüm tüm örnekler yalnızca ana sürümü gösteriyor.
Nikhil Agrawal

4
Bunlar sadece örneklerdir ve bunun mümkün olan tek yol olduğu hiçbir yerde belirtilmemiştir.
Evk

Yanıtlar:


166

Bağlayıcı yönlendirmeler neden gerekli? Kitaplık B'ye ve ayrıca 1.1.2.5 sürümünün C kitaplığına başvuran A uygulamanız olduğunu varsayalım. Kitaplık B de kitaplık C'ye başvurur, ancak 1.1.1.0 sürümüne aittir. Şimdi bir çatışmamız var çünkü çalışma zamanında aynı derlemenin farklı sürümlerini yükleyemezsiniz. Bu çelişkiyi çözmek için, genellikle yeni sürüme (ancak eski sürümde de olabilir) bağlama yeniden yönlendirmesini kullanabilirsiniz. Bunu, configuration > runtime > assemblyBindingbölümün altındaki A uygulamasının app.config dosyasına aşağıdakileri ekleyerek yaparsınız (tam yapılandırma dosyası örneği için buraya bakın ):

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

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

Eşlenecek bir dizi sürüm de belirtebilirsiniz:

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

1.1.1.0 sürümünün C'sine referansla derlenmiş olan kitaplık B, çalışma zamanında 1.1.2.5 sürümünün C'sini kullanacaktır. Elbette, C kitaplığının geriye dönük olarak uyumlu olduğundan emin olmanız daha iyi olur, aksi takdirde bu beklenmedik sonuçlara yol açabilir.

Yalnızca büyük sürümleri değil, kitaplıkların tüm sürümlerini yeniden yönlendirebilirsiniz.


Bunlar hangi dosyaya ve hangi bölümün altına giriyor? Lütfen birisi referans için MSDN veya benzeri bir kaynağa bağlantı sağlayabilir mi? İnsanların arama motoru alanının her yerinden SO Q / A makalelerinize ineceğini ve referansların kritik olduğunu unutmayın. Bir iş arkadaşım bir hafta tatile çıkmadan hemen önce "exe dosyanıza bir montaj yönlendirmesi eklememi" söyledi ve buraya geldim ve bu yanıt harika görünse de bağlam ve referans eksik.
tpartee

Geçerli sorular @tpartee, yanıtı yapılandırma bölümünü ve docs.microsoft.com/en-us/dotnet/framework/configure-apps/…
Kobus Smit

1
@AlexanderDerck A uygulamasının yapılandırma dosyasında - kitaplıkların yapılandırma dosyalarında hiçbir etkisi yoktur (bildiğim kadarıyla), belki bu kitaplığın birim test kitaplığı olduğu ve bir anlamda birim test çalıştırıcısı tarafından "yürütüldüğü" durumlar dışında.
Evk

1
@AlexanderDerck, birkaç hafta önce, birçok olumlu oy ve hatta ödül içeren bir soru vardı, tam olarak bunu soruyordu, ancak kimse ikna edici bir cevap veremedi - stackoverflow.com/q/48377474/5311735
Evk

1
@CodeEngine publicKeyToken, C derlemesini tanımlar. Yalnızca imzalı derlemelerde, bunları tanımlayan ortak anahtar belirteci vardır. Assembly'ye sahip olduğunuz için bu belirteci nasıl bulabileceğinizle ilgili bir soru: stackoverflow.com/q/3045033/5311735
Evk

56

NewtonSoft.Json için bağlama yönlendirmesiyle ilgili bir sorunla karşılaştık. Dosya sürümünü "9.0.1.19813" win 10 dosya özelliklerinde aradık, numarayı aradık ve yönlendirme başarısız olmaya devam etti. Daha fazla araştırma yaptık ve montaj sürümüne değil dosya sürümüne baktığımızı gördük. Bu yüzden, insanların Dosya Sürümünü (sık sık değişir) ve Montaj sürümünü (Windows 10 Dosya Gezgini'nde göremediğiniz) yanlış mı düşündüklerini merak ediyorum. Bir dll'nin Assembly versiyonunu görmek için bunu powershell'de çalıştırabilirsiniz. Dll adını, sürümünü bulmak istediğiniz dll ile değiştirin.

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

Yukarıdakinin sonucu.

Major  Minor  Build  Revision

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

9      0      0      0

Referanslara Bakın:

Windows Vista ve sonraki sürümlerde (WIndows 7, 2008) bir .NET derlemesinin derleme sürümünü nasıl görebilirim?

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

görüntü açıklamasını buraya girin


12
Dosya sürümü ve Montaj sürümü arasındaki farkı ortaya çıkarmak için oy verin !!
mrid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.