Uyarı: Aynı bağımlı montajın farklı sürümleri arasında çakışmalar bulundu


320

Şu anda 20 projeden oluşan bir .NET uygulaması geliştiriyorum. Bu projelerin bazıları .NET 3.5 kullanılarak derlenirken, bazıları hala .NET 2.0 projeleri (şimdiye kadar sorun değil).

Sorun şu ki, harici bir bileşen eklersem her zaman aşağıdaki uyarıyı alırım:

"Found conflicts between different versions of the same dependent assembly".

Bu uyarı tam olarak ne anlama geliyor ve bu uyarıyı hariç tutma olasılığı var mı (kaynak kodu dosyalarında #pragma devre dışı bırakmak gibi)?


Yanıtlar:


410

Bu uyarı, iki projenin aynı montajı (örn. System.Windows.Forms) Referans aldığı, ancak iki projenin farklı versiyonlar gerektirdiği anlamına gelir . Birkaç seçeneğiniz var:

  1. Tüm projeleri aynı sürümleri kullanacak şekilde yeniden derleyin (örneğin, tümünü .Net 3.5'e taşıyın). Tüm kodlar derlendikleri bağımlılık sürümleriyle çalıştığı için bu tercih edilen seçenektir.

  2. Bir bağlayıcı yönlendirme ekleyin . Bu uyarıyı bastırır. Ancak, .Net 2.0 projeleriniz (çalışma zamanında) gibi bağımlı derlemelerin .Net 3.5 sürümlerine bağlı olacaktır System.Windows.Forms. Visual Studio'da hatayı çift tıklatarak hızlı bir şekilde bir bağlayıcı yönlendirme ekleyebilirsiniz.

  3. Kullanın CopyLocal=true. Bunun uyarıyı bastırıp bastıramayacağından emin değilim. Yukarıdaki seçenek 2 gibi, tüm projelerin System.Windows.Forms'un .Net 3.5 sürümünü kullanacağı anlamına gelir.

Sorunlu referansları tanımlamak için birkaç yol aşağıda verilmiştir:

  • Https://gist.github.com/1553265 adresinde bulunan gibi bir yardımcı programı kullanabilirsiniz.
  • Başka bir basit yöntem, Yapı çıktı ayrıntı düzeyini (Araçlar, Seçenekler, Projeler ve Çözümler, Yapı ve Çalıştır, MSBuild proje yapı çıktı ayrıntı düzeyini, Ayrıntılı) ayarlamak ve oluşturduktan sonra, uyarı için çıkış penceresinde arama yapmak ve hemen üstündeki metne bakmaktır. . ( Bu cevabın yorumlarında bunu öneren pauloya'ya şapka ipucu ) .

9
Sadece yardımcı program olmadan bulmanın hızlı bir yolu için - bağlayıcı yönlendirmeyi eklerseniz (seçenek 2 olarak), orada bulunan referansları gösterir - istenirse, diğer yöntemlerden birini kullanabilirsiniz işlemek ve yapılandırma dosyanızdan bağlayıcı yönlendirmeleri silmek için.
Brisbe

222
"Sorun yaratan referans (lar)" ı bulmanın en basit yolu Yapı çıktı ayrıntı düzeyini (Araçlar, Seçenekler, Projeler ve Çözümler, Yapı ve Çalıştır, MSBuild proje yapı çıktı ayrıntı düzeyi, Ayrıntılı) ayarlamak ve derledikten sonra çıktı penceresini aramaktır. uyarı için. Hemen üstündeki metne bakın.
pauloya

7
Uyarıyı çift tıklatarak yönlendirmeyi bağlama (2. adım) uyarımı kaldırmayın. Bunun nedeni şüpheli derleme ile app.config eklendiğini görüyorum, ancak bir temizleme / yeniden oluşturma işleminden sonra uyarı hala orada. Ayrıca ek olarak, adım 3 çalıştı, hayır şans. Herhangi bir fikir?
angularsen

9
Ya kendi projelerinizden referans değillerse? Örneğin, Newtonsoft.Json, Sürüm = 6.0.0.0 bağımlılığı olan bir projeye başvuruda bulundum ve Newtonsoft.Json, Sürüm = 4.5.0.0 bağımlılığı olan başka bir projeye başvuruda bulundum
Edward Ned Harvey

3
@ brian-low, bağlı yardımcı programın yanı sıra cevabınızda seçenek olarak Yapı çıktı ayrıntı düzeyini (@pauloya tarafından yorumda önerildiği gibi) eklemenizi önerebilir miyim? (Feragatname, aslında sadece bunu yapmak için cevabı düzenlemeye çalıştım ama inceleme üzerine reddedildi :))
Rick Riensche

44

Temelde bu, başvuruda bulunduğunuz derlemeler "Yerel Kopyala" "Doğru" olarak ayarlandığında oluşur, yani DLL'nin bir kopyası exe'nizle birlikte bin klasörüne yerleştirilir.

Visual Studio başvurulan bir derlemenin tüm bağımlılıklarını da kopyalayacağından, başvurulmakta olan aynı derlemenin iki farklı derlemesi ile sonuçlanabilir. Projeleriniz ayrı çözümlerde bulunuyorsa ve bu nedenle ayrı olarak derlenebiliyorsa, bu daha olasıdır.

Etrafımda elde ettiğim yol, montaj projelerindeki referanslar için Yerel Kopyala ayarını yanlış yapmaktır. Yalnızca bitmiş ürünün çalışması için derlemeye ihtiyaç duyduğunuz yürütülebilir dosyalar / web uygulamaları için yapın.

Umarım mantıklıdır!


31

Pauloya'nın çözümünü yukarıdaki yorumlarda yayınlamak istedim. Sorun yaratan referansları bulmak için en iyi çözüm olduğuna inanıyorum.

"Sorun yaratan referans (lar)" ı bulmanın en basit yolu Yapı çıktı ayrıntı düzeyini (Araçlar, Seçenekler, Projeler ve Çözümler, Yapı ve Çalıştır, MSBuild proje yapı çıktı ayrıntı düzeyi, Ayrıntılı) ayarlamak ve derledikten sonra çıktı penceresini aramaktır. uyarı için. Hemen üstündeki metne bakın.

Örneğin, çıktı panelinde "çakışma" aradığınızda şöyle bir şey bulabilirsiniz:

3>  There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3>      "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.

Gördüğünüz gibi, EF sürüm 5 ve 6 arasında bir çakışma var.


3
Ama şimdi bu bilgiye sahip olduğum için hatayı nasıl kaldırabilirim? Çatışmanın ne olduğunu görebiliyorum, ancak projenin çakışan sürüme referansta bulunduğu yeri bulamıyorum
Bassie

Merhaba @Bassie, yapılacak ilk şey, nuget paket dosyanızı kontrol etmek ve tüm dosyaları paketin aynı sürümüne güncellemeniz gerekip gerekmediğini belirlemek olacaktır. Bunu update-package [your package name] -version 6.0.0 -reinstall
cevabımdaki

@Bassie, uyarının önerilerini yapabilir ve bağlayıcı yönlendirmeyi app.config dosyasına ekleyebilirsiniz! (güncelleme bir seçenek değilse, yani.)
BrainSlugs83

@Bassie cevabımı görmek, nerede size uyumsuzluk sorunlarına neden olan farklı meclisleri / .dll almak için nasıl var göstereceğim.
newprint

22

Projelerimden biriyle aynı sorunu yaşadım, ancak yukarıdakilerin hiçbiri uyarıyı çözmeye yardımcı olmadı. Ayrıntılı derleme günlük dosyasını kontrol ettim, etkilenen çözümdeki her proje için doğru sürümleri kullandığımı doğrulamak için AsmSpy kullandım, her proje dosyasındaki gerçek girişleri iki kez kontrol ettim - hiçbir şey yardımcı olmadı.

Sonunda, sorunun bir projede sahip olduğum referanslardan birinin iç içe bağımlılığı olduğu ortaya çıktı. Bu referans (A), benim çözümümdeki diğer tüm projelerden doğrudan referans alınan (B) 'nin farklı bir sürümünü gerektiriyordu. Başvurulan projedeki referansın güncellenmesi sorunu çözdü.

Solution A
+--Project A
   +--Reference A (version 1.1.0.0)
   +--Reference B
+--Project B
   +--Reference A (version 1.1.0.0)
   +--Reference B
   +--Reference C
+--Project C
   +--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)

Solution B
+--Project A
   +--Reference A (version 1.1.1.0)

Umarım yukarıda ne demek istediğimi gösterir, öğrenmek için birkaç saatimi aldı, bu yüzden umarım başka biri de yararlanır.


1
Burada da aynı problem. Ancak, referansı daha yeni bir sürüme güncelleme şansım yok. Bir App.config kullanmayı denedim: uygulama için çalışırken, Visual Studio 2010, oluşturma sırasında bunu yok sayıyor gibi görünüyor.
Thomas Weller

1
vay, iki aydır bu problemler yaşadım ve kesin olarak çözemedim. Bazı nedenlerden dolayı, yalnızca hata ayıklama sırasında çökebilir ve bazı durumlarda, rahatsız edici .dll dosyasını bu olduğunda bin klasöründe gerçek olanla manuel olarak değiştirir. Hata ayıklama gerçek bir acıydı. Cevabınızı okuduğumda bunun tam olarak başıma geldiğini fark ettim ve 5 dakika gibi bir sürede
düzelttim

19

Visual Studio üzerinde sağ tıklarsanız çözümü ve Nuget paketleri yönetme bir gidecekseniz "birleştirin" Aynı versiyona tüm paketleri ayarlar sekmesi.


Bahşiş için teşekkürler. Bu sefer bana yardımcı olmadı, ama orada olduğunu bilmek güzel.
BrainSlugs83

8

Bu uyarı mesajını aldım ve çözümü temizledim ve derledim (Build -> Clean Solution) ve gitti.


9
Ancak çözümü yeniden inşa edene kadar
Luke

Bu beni kurtarıyor! Dünden beri başka bir çözüm deniyorum ama bu sorunumu çözdü. Bu yoruma yukarıdaki ^ dahil. Teşekkürler!
vnpnlz

6

Aynı sorunu yaşadım ve web.config dosyasında aşağıdakileri değiştirerek çözdüm.

Uygulamayı Newtonsoft.Json 4.0 kullanarak çalıştırıyorum çünkü bana oldu

Gönderen:

<dependentAssembly>
  <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>

Kime:

<dependentAssembly>
  <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>

Benim için çözüm buydu. Daha yüksek sürüme bağlayıcı bir yönlendirme yaptım ve yalnızca alt sürüme geçtikten sonra işe yaradı.
mrwaim

1
neden? Benim için çok garip. EF kullanmıyorum, ama her zaman son sürüme geçmek istediğimizi düşündüm?
Hoàng Long

1
@ HoàngLong, başvuruda bulunduğunuz sürüm daha eski sürüm, ancak dahil ettiğiniz sürüm daha yeni sürüm.
BrainSlugs83

3

Bağımlılıklarınızı yönetmek için Nuget kullanıyorsanız bunu yapmanın başka bir yolu var. Bazen VS ve Nuget'in eşleşmediğini ve Nuget'in projelerinizin senkronize olmadığını tanıyamadıklarını keşfettim. Packages.config bir şey söyleyecek, ancak Referanslar - Özellikler'de gösterilen yol başka bir şey gösterecektir.

Bağımlılıklarınızı güncellemek istiyorsanız, aşağıdakileri yapın:

  1. Solution Explorer'dan Project'i sağ tıklatın ve 'Nuget Paketlerini Yönet'i tıklatın

  2. Sol bölmedeki 'Yüklü paketler' sekmesini seçin Yüklü paketlerinizi kaydedin Çok şey varsa paketlerinizi.config dosyasını masaüstünüze kopyalamak isteyebilirsiniz, böylece Nuget pkgs'in yüklü olduğunu görmek için Google ile çapraz kontrol edebilirsiniz.

  3. Paketlerinizi kaldırın. Sorun değil, onları geri ekleyeceğiz.

  4. İhtiyacınız olan paketleri hemen kurun. Nuget'in yapacağı sadece en son sürümü almakla kalmaz, aynı zamanda referanslarınızı değiştirir ve sizin için bağlayıcı yönlendirmeleri ekler.

  5. Bunu tüm projeleriniz için yapın.

  6. Çözüm düzeyinde, bir Temizle ve Yeniden Oluşturun.

Daha düşük projelerle başlayıp daha üst düzey olanlara kadar ilerleyebilir ve ilerledikçe her projeyi yeniden inşa edebilirsiniz.

Bağımlılıklarınızı güncellemek istemiyorsanız, paket yöneticisi konsolunu kullanabilir ve Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber] sözdizimini kullanabilirsiniz.


2

Bu aslında harici bileşeninize bağlıdır. Bir .NET uygulamasında harici bir bileşene başvurduğunuzda, bu bileşeni tanımlamak için bir GUID oluşturur. Bu hata, projelerinizden biri tarafından başvurulan dış bileşen, başka bir derlemede böyle bir bileşenle aynı ada ve farklı bir sürüme sahip olduğunda oluşur.

Bu bazen referansları bulmak ve derlemenin yanlış sürümünü eklemek için "Gözat" ı kullandığınızda veya kod deponuzda yerel makineye yüklediğiniz bileşenin farklı bir sürümüne sahip olduğunuzda ortaya çıkar.

Hangi projelerin bu çakışmalara sahip olduğunu bulmaya çalışın, bileşenleri referans listesinden kaldırın, ardından aynı dosyayı işaret ettiğinizden emin olarak tekrar ekleyin.


2

=> kısmen yüklenmiş bir uygulama örneği olup olmadığını kontrol edin.

=> her şeyden önce bu örneği kaldırma uygulamasından kaldırın.

=> sonra temizleyin, yeniden oluşturun ve dağıtmaya çalışın.

bu benim sorunumu çözdü. umarım sana da yardımcı olur. Saygılarımla.


1

Ayrıca bu sorun vardı - benim durumumda "Belirli Sürüm" özelliği true olarak ayarlanmış bir dizi olması neden oldu. Bu başvurularda bunu false olarak değiştirmek sorunu çözdü.


1

NuGet kullanarak tek yapmam gereken:

  1. projeye sağ tıklayın ve NuGet Paketlerini Yönet'e tıklayın.

  2. sağ üstteki dişliyi tıklayın

  3. NuGet Paket Yöneticisi'nde Paket Kaynakları'nın üstündeki Genel sekmesini tıklayın

  4. Bağlama Yönlendirmeleri'nde "Bağlama yönlendirmeleri uygulama atla" seçeneğini işaretleyin

  5. Temizleyin ve yeniden inşa edin ve uyarı gitti

Çantada keklik


1

Ben sadece aynı sorunu ayıklamak için geçirdim. Not, bu sorun farklı projeler arasında değil, aslında aynı dll / derleme farklı sürümlerine bağlı bir projede birkaç referans arasında olabilir. Benim durumumda, sorun, FastMember.dlltek bir projede iki farklı NuGet paketinden gelen referans sürümleri uyuşmazlığıydı. Bana bir proje verildiğinde, derlenmedi çünkü NuGet paketleri eksikti ve VS eksik paketleri geri yüklemeyi reddetti. NuGet menüsü aracılığıyla, tüm NuGet'leri manuel olarak en son sürüme, yani uyarının göründüğü şekilde güncelliyorum.

Visual Studio'da Tools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics.Pencerede satır (lar) There was a conflict betweenı Outputbulun. Aşağıda çıktı aldığım kısmı:

1>  There was a conflict between "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null". (TaskId:19)
1>      "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" was chosen because it was primary and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" was not. (TaskId:19)
1>      References which depend on "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" [C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll]. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll". (TaskId:19)
1>              FastMember, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)
1>      References which depend on "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" []. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll". (TaskId:19)
1>              ClosedXML, Version=0.94.2.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)

Dikkat edin, Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll"

ClosedXML.dllClosedXMLNuGet'ten geliyor ve buna bağlı FastMember.dll 1.3.0.0. FastMemberÜstelik, projede de Nuget var ve var FastMember.dll 1.5.0.0. Uyumsuzluk !

Ben kaldırmadan ClosedXML& FastMemberNuGets, ben yönlendirmeyi bağlayıcı çünkü ve sadece son sürümünün yüklü ClosedXMLYani sabit konuyla!


0

Bu da bana oldu. Bir dll'ye iki kez başvurulmuştur: bir kez doğrudan (referanslarda) ve bir kez dolaylı olarak (başka bir başvurulan proje tarafından referans verilir). Doğrudan referansı kaldırdım, temizledim ve yeniden oluşturdum. Problem çözüldü.


0
  1. "Çözüm Gezgini" ni açın.
  2. "Tüm dosyaları göster" i tıklayın
  3. "Referanslar" ı genişletin
  4. Diğerlerinden biraz farklı bir simgeye sahip bir (veya daha fazla) referans göreceksiniz. Tipik olarak, sarı kutu ile not almanızı önerir. Sadece kaldır.
  5. Referansı geri ekleyin ve kodunuzu derleyin.
  6. Bu kadar.

Benim durumumda, MySQL referansıyla ilgili bir sorun vardı. Her nasılsa, mevcut tüm referansların listesi altında üç versiyonunu listeleyebilirim; .net 2.0, .net 4.0 ve .net 4.5 için. Yukarıdaki 1'den 6'ya kadar olan süreci izledim ve benim için çalıştı.


0

Dikkate alınması ve kontrol edilmesi gereken başka bir şey, o bin klasörünü kullanan herhangi bir hizmetin olmadığından emin olmaktır. onların ise hizmeti durdurun ve çözümü yeniden oluşturun


0

.Resx dosyalarını düzenlerken Mac Visual Studio'da bir sorun var gibi görünüyor. Ne olduğunu gerçekten bilmiyorum, ancak Mac'imde bazı .resx dosyalarını düzenlediğimde bu sorunu aldım. Projeyi Windows'ta açtım, dosyaları açtım ve sanki düzenlenmemiş gibiydim. Bu yüzden onları düzenledim, kaydettim ve her şey Mac'te de tekrar çalışmaya başladı.


0

Projem NETStandardLibrary'ye başvurduğunda ve başvurulan derlemelerden biri netcore için yayınlandığında böyle bir sorun yaşadım. Az önce standart olarak yayınlandı ve sorun ortadan kalktı


0

İşte çözüm, .NET Core 3.0 stili: https://github.com/HTD/ref-check

Hangi uyuşmazlıkları bulduğunuzda, belki de uyuşmazlıkları çözebilirsiniz. Çakışan başvurular başka paketlerden geliyorsa, ya şansınız kalmaz ya da bunun yerine kaynakları kullanmanız gerekir.

Benim durumumda, çatışan paketler genellikle kendimimdir, bu yüzden bağımlılık sorunlarını çözebilir ve yeniden yayınlayabilirim.

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.