2012-07-04 17 views
9

.NET dünyasında, sürüm çakışmasına neden olan geçişli bağımlılıkları yönetmenin en iyi yöntemi nedir? AyrıntılarGeçiş Bağımlılığı Aynı DLL'in çakışan sürümüne neden oluyor

: Projesi da kütüphane C bağlıdır Project B bağlıdır

da

Projesi da farklı ve kitaplığın (potansiyel olarak) uyumlu sürümüne bağlıdır ProjektX bağlıdır C

A-> B> Cv1.0
&
A-> X> Cv2.0

CV1 0,0 <> Cv2.0

  • bu işi yapmak için bir yolu var mı?

  • GAC kullanılarak OLMADAN yapılabilir mi?

  • B ve X yalnızca ikili biçimde (kaynak erişilebilir değil) olsa bile yapılabilir mi? Başka bir deyişle

orada çatışmaları neden olmadan Proje A'da birlikte kullanıldıklarında ben kendi bağımlılıkları kullanarak Proje B ve X her biri bir yoldur.

NOT: İdeal olarak bu problemi hiç bilmemem gerektiğinin farkındayım, fakat dış kütüphanelere bağımlılık arttıkça bunun kaçınılmaz bir yan etkisi olacaktır. Bu yüzden bununla en iyi nasıl başa çıkacağını merak etmeliyim.

+1

İdeal olarak, B'nin mevcut sürümüne bağlı olarak B'yi yeniden oluşturmalı veya güncellemelisiniz. Bunu yapamazsanız, sürümleri yeniden eşleştirmeyi deneyebilirsiniz. http://stackoverflow.com/a/11126867/48082 Bu işe yaramaz! – Cheeso

+1

İdeal olarak, projenin, köprünün bulunduğu yerdeki durumdan kaçınmak için temizlenmesi gerektiğini kabul etti, ancak bu her zaman mümkün değil. – Newtopian

+0

bir şekilde remapping DLL, her iki sürümü de birbiriyle uyumluysa iyi olur. En kötü durum senaryosu, uyumlu olmadıklarında, her bir orta bağımlılığın, kendi oluşturduğu versiyonu kullanmasına ve ana projenin beklediği işi yapmaya devam etmesinin bir yoludur. – Newtopian

cevap

4

Yığın Taşması Üzerine birçok benzer soru var. Örneğin, Referencing 2 different versions of log4net in the same solution

Özet:

  1. ana yürütülebilir içeren klasör içinde sırasıyla montaj klasör 1.0 C ve 2.0 dağıtma emin olun.
  2. Değişim app.config dosyası ve aşağıdaki gibi bir şey şunlardır:
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="C" publicKeyToken="C's public key token" /> 
     <codeBase version="version string for C1.0 e.g. 1.0.0.0" href="1.0\C.dll" /> 
     <codeBase version="version string for C2.0 e.g. 2.0.0.0" href="2.0\C.dll" /> 
     </assemblyIdentity> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

Eğer

v1 Eğer -T C.dll sn kullanılarak C genel anahtar belirteci alabilirsiniz. 0 ve v2.0 of C farklı ortak anahtarlara sahiptir (ideal olarak yapmasalar bile), sonra iki tane bağımlıAssembly etiketini içerir.

+1

gerçekten birçok soru var ama hiçbiri sorumu gerçekten cevaplamadı. AssemblyBinding konusundaki anlayışım, hangi ad alanının kullanıldığını ve çağrıları buna göre yeniden yönlendirmenin belirtilmesine izin vermekti. Burada her bir çağrı yolu sonuçta tek bir DLL'yi hedefler. Ben maruz kaldığım senaryoda, iki farklı DLL'yi hedeflemesi gereken iki aynı çağrı yolumuz var. Tek fark, her biri farklı bir "ana" DLL denir. AssemblyBinding'in amacını doğru olarak anlamadım sürece budur. – Newtopian

+0

Tha, iki bağımlılığın (yukarıdaki örnekteki X ve B) yayıncılarının kütüphanelerini üretirken DLL bağımlılığı (C üstündeki) sürümlerini özel olarak desteklemesi gerekiyorsa, herşeyin işe yarayacağını (her iki C Dll'nin benzersiz bir şekilde tanımlanabildiğini) tahmin ediyorum. dosyalar, yani farklı ad ve/veya yollar). Mecburi ile biraz deneme yapmam gerekecekBen ne yapılabileceğine bakın – Newtopian

+0

Eğer C güçlü bir şekilde isimlendirilmişse, yukarıda çalışmalı ve B ve X için doğru C sürümünü yükleyebilmelidir. Eğer güçlü bir şekilde isimlendirilmemişse ama yine de bir versiyonu varsa (AssemblyVersion özniteliği ile belirtildiği gibi), publicKeyToken'ı kaldırmayı deneyebilir ve hala çalışıp çalışmadığını görebilirsiniz. Eğer bu işe yaramazsa, sadece umarım AssemblyResolve olayı olacağını düşünüyorum. Bütün bu if ve butları kontrol edip sonuçları paylaşmaya çalışacağım. –

İlgili konular