Aynı bağımlı derlemenin farklı sürümleri arasında çözülemeyen çakışmalar bulundu


371

Temizlediğimde ve daha sonra birkaç projeye sahip olan çözümümü oluşturduğumda, çıkış penceresi derlemenin başarılı olduğunu bildiriyor. Ancak, Hata Listesi Penceresini görüntülediğimde bana şu uyarıyı gösteriyor:

Aynı bağımlı derlemenin çözümlenemeyen farklı sürümleri arasında çakışmalar bulundu. Bu ayrıntı çakışmaları, günlük ayrıntı ayrıntıları ayrıntılı olarak ayarlandığında derleme günlüğünde listelenir. C: \ Program Dosyaları (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets

Bu iletiyi çift tıklattığımda, C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets dosyasını açar, ancak içinde hiçbir şey anlamıyorum.

Web için Visual Studio Express 2013 kullanıyorum.

Neyin yanlış olduğunu ve hangi DLL ile nasıl olduğunu nasıl öğrenebilirim ve sonra uyarıyı nasıl ortadan kaldırabilirim?



Yanıtlar:


513

eta: SO'nun kendi @Nick Craver'inin okuması gereken bir katil makalesi var


Diğer yanıtlar bunu söylüyor olsa da, onlar açık yapmaz, bu yüzden ben ....

VS2013.2'de, belirtilen bilgilerin emisyonunu gerçekten tetiklemek için, şu mesajı okumamanız gerekir:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): uyarı MSB3277: Aynı bağımlı derlemenin çözümlenemeyen farklı sürümleri arasında çakışma bulundu. Bu ayrıntı çakışmaları, günlük ayrıntı ayrıntıları ayrıntılı olarak ayarlandığında derleme günlüğünde listelenir .

Bu yanlış (veya en azından Visual Studio'nun bazı sürümleri içindi - güncel VS2015 Güncelleme 3 veya üzeri için sorun yok gibi görünüyor). Bunun yerine Tanılama'ya ( Araçlar-> Seçenekler-> Proje ve Çözümler-> Oluştur ve Çalıştır , MSBuild proje derlemesi çıktı ayrıntı düzeyini ayarla) çevirin , bunun gibi mesajlar göreceksiniz:

"Newtonsoft.Json, Sürüm = 6.0.0.0, Kültür = nötr, PublicKeyToken = 30ad4fe6b2a6aeed" ve "Newtonsoft.Json, Sürüm = 6.0.5.17707, Kültür = nötr, PublicKeyToken = 30ad4fe6b2a6aeed" arasında bir çakışma vardı.

  • Birincil olduğu için "Newtonsoft.Json, Sürüm = 6.0.0.0, Kültür = nötr, PublicKeyToken = 30ad4fe6b2a6aeed" seçildi ve "Newtonsoft.Json, Sürüm = 6.0.5.17707, Kültür = nötr, PublicKeyToken = 30ad4fe6b2a6aeed" seçilmedi.

Sonra

  • Ctrl-Alt-O Çıkış penceresine gitme
  • keşfi bulmak için " seçilmiş " araması .

... Ve evet, [teşhis] mesajının ayrıntılarına bakanlar için, bu cahilde , tüm 6.xversiyonların, dahili olarak Montaj Versiyonu 6.0.0.0, yani sadece SemVer Major bileşeninin Meclise girdiği bir kongre olduğu bildirildi. Sürüm :)


3
Teşekkürler - Visual Studio'yu uzun yıllardır kullanıyorsunuz ve derleme günlüğünde bu derin kazmayı gerektiren bir sorun yaşamadım. Farklı bir sorun ama aradığım bilgilerin bir yere yayıldığını fark etmek sorunumu çözdü.
Timothy Lee Russell

4
Ayrıntılı günlük düzeyi VS içinde çalışıyor gibi görünüyor (bu yüzden tanı gerekli değildir). MSBuild'in VS içinde farklı davrandığı ilk kez olmayacaktı ....
Johannes Rudolph

105
Günlük ayrıntı düzeyini Araçlar-> Seçenekler menüsünden değiştirmek için Proje ve Çözümler-> Oluştur ve Çalıştır
Jenn

3
Benim durumumda, üç çatışma yaşadım ve bunlardan biri diğer ikisinden sorumluydu. "Ayrıntılı" derleme günlüğümü Not Defteri'ne kopyaladım, "çakışma" araması yaptım, tanıdığım referans için NuGet paketini güncelledim ve sorun çözüldü.
Isaac Lyman

@robotnik [Diğerleri tarafından reddedildi] düzenleme önerisi için teşekkürler. Aslında cevabın alt kısmındaki bilgileri dahil ettim ama umarım şimdi olduğu gibi cevap istediğiniz kadar açıktır.
Ruben Bartelink

76

Çözümünüzü komut satırından oluşturmak ve biraz daha fazla ayrıntı almak için msbuild Foo.sln /t:Rebuild /v:diag(from C:\Program Files (x86)\MSBuild\12.0\bin) komutunu çalıştırın , ardından .csproj.uyarıyı günlüğe kaydedip bul ve sürümde farklılık gösteren aynı ortak montajı kullanan diğer projelerin referanslarını ve referanslarını kontrol edin.

Düzenleme: Ayrıca yapı ayrıntı düzeyini doğrudan VS2013'te ayarlayabilirsiniz. Git Tools> Optionsmenü sonra gidip Projects and Solutionsve set MSBuild ayrıntı Diagnostic.

Düzenleme: Sadece kendim bir tane var gibi birkaç açıklama. Benim durumumda uyarı, Referans Ekle iletişim kutusunun aksine Resharper komut istemini kullanarak bir referans eklememden kaynaklanıyordu, bu da hem v4 hem de v12 arasından seçim yapmak için kullanılabilir olsa bile sürümsüz oldu.

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework" />

vs

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework, Version=12.0.0.0, ..." />

/v:diagAyrıntılarla MSBuild günlüğünde aşağıdaki gibi görünüyordu. hangi iki referansın çatıştığına dair ayrıntılar vermek:

  There was a conflict between 
  "Microsoft.Build.Framework, Version=4.0.0.0, ..." and 
  "Microsoft.Build.Framework, Version=12.0.0.0, ...". (TaskId:16)

      "Microsoft.Build.Framework, Version=4.0.0.0, ..." was chosen because it was primary and 
      "Microsoft.Build.Framework, Version=12.0.0.0, ..." was not. (TaskId:16)

      References which depend on "Microsoft.Build.Framework, Version=4.0.0.0, ..." 
      [C:\...\v4.5.1\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v4.5.1\Microsoft.Build.Framework.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v4.5.1\Microsoft.Build.Framework.dll". (TaskId:16)
              Microsoft.Build.Framework (TaskId:16)

      References which depend on "Microsoft.Build.Framework, Version=12.0.0.0, ..." 
      [C:\...\v12.0\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v12.0\Microsoft.Build.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v12.0\Microsoft.Build.dll". (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

          C:\...\v12.0\Microsoft.Build.Engine.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v12.0\Microsoft.Build.Engine.dll". (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3277: 
Found conflicts between different versions of the same dependent assembly that could not be resolved.  
These reference conflicts are listed in the build log when log verbosity is set to detailed. 
[C:\Users\Ilya.Kozhevnikov\Dropbox\BuildTree\BuildTree\BuildTree.csproj]

10
Ben bir günlük dosyasına bu komutu piping sona erdi, bu yüzden daha kolay bakmak olabilir:msbuild "Foo.sln" /t:Rebuild /v:d > build.log
CrazyPyro

2
Bunun için terminale gitmenin en iyi yolu: stackoverflow.com/a/22702405/268066
CrazyPyro

@CrazyPyro msbuild'in "yerleşik" bir borusu vardır - /l:FileLogger,Microsoft.Build.Engine;logfile=build.log- kaydedicilerin açıklama anahtarlarına
drzaus

3
"Derleme günlüğü" nerededir? Nasıl bulurum?
Mahkum SIFIR

Bu cevap, tek bir kullanıcının önem verdiği msbuild'den nasıl daha fazla ayrıntı alacağını gösterir. Diğer tüm yanıtlar VS kullandığınızı ve bir Windows ortamında çalıştığınızı varsayar.
UnconditionallyReinstateMonica

39

Görüntülenen iki mesaj arasında bir karşılaştırma ile sadece Ruben'in cevabını destekleyebilirim:

resim açıklamasını buraya girin

ve mesajı:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): uyarı MSB3277: Aynı bağımlı derlemenin çözümlenemeyen farklı sürümleri arasında çakışma bulundu. Günlük ayrıntı olarak ayarlandığında Bu referans çakışmaları yapı günlük listelenen detaylı .

Yani Ruben'in hakkı — bu doğru değil. Hiçbir çatışma yok, sadece eksik bir montaj. Bu özellikle proje bir ASP.NET uygulaması olduğunda sıkıcıdır, çünkü görünümler talep üzerine , yani ilk kez gösterilmeden hemen önce derlenir . Bu, montajı hazır hale getirmenin gerekli olduğu zamandır. (Kodun geri kalanıyla birlikte görünümleri önceden derleme seçeneği vardır, ancak bu başka bir hikaye .) Öte yandan, ayrıntı düzeyini Teşhis olarak ayarlarsanız aşağıdaki çıktıyı alırsınız:

C: \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5): uyarı MSB3245: Bu başvuru çözülemedi. "System.Web.Razor, Sürüm = 3.0.0.0, Kültür = nötr, PublicKeyToken = 31bf3856ad364e35, işlemciArchitecture = MSIL" derlemesi bulunamadı. Montajın diskte bulunduğundan emin olun. Kodunuz için bu başvuru gerekiyorsa, derleme hataları alabilirsiniz.

Sonuç olarak, tek yapmanız gereken:

  1. Derlemeye el ile bir başvuru ekleyin (diskte, belki GAC'de bulun ve "doğrudan" başvuru olarak ekleyin) veya
  2. İndirmek ve içindeki montajı referans almak için NuGet paketini (galeride yayınlanmışsa) kullanın.

NuGet galerisi hakkında daha fazla bilgiyi burada bulabilirsiniz . ASP.NET görünümlerini önceden derleme hakkında daha fazla bilgiyi burada bulabilirsiniz .


VS 2017'de, "MSBuild proje oluşturma çıktı ayrıntı düzeyi" (günlük dosyası değil) Ayrıntılı (Tanılama değil) olarak ayarlandığında, Çıkış penceremde "Derleme bulunamadı" hatası alıyorum.
ALEXintlsos

@ALEXintlsos: görünüşe göre bu işlev değişti; hala nerede olursa olsun hata var - ondan kurtulmak için talimatları izleyin.
Alexander Christov

22

Görsel stüdyoda yapı ayrıntı düzeyini değiştirmek doğru yönü göstermeye yardımcı olacaktır. VS'de ayrıntı düzeyini değiştirmek için aşağıdaki adımları izleyin

  1. VS'de Araçlar-> Seçenekler menüsüne gidin
  2. Açık Projeler ve Çözümler-> İnşa Et ve Çalıştır
  3. MSBuild proje derlemesi çıktı ayrıntı düzeyinin değerini değiştirin. Bir tane seçin Quiet, Minimal, Normal, DetailedveDiagnostic

Derleme günlüğündeki değişiklikleri görmek için VS'deki çıkış penceresini ( Ctrl+ Alt+ O) kontrol edin .


16

ve sonra uyarıyı nasıl ortadan kaldırabilirim?

Bunu düzeltmek için muhtemelen NuGet paketlerinizi yeniden yüklemeniz veya yükseltmeniz gerekecek .


2
Bu, bir paketi düzgün bir şekilde yeniden yüklemeyi reddettiğinde Visual Studio'yu yeniden başlatmanın bir kombinasyonuyla sorunu benim için çözdü.
Ohad Schneider

22
Kontrol etmenin en kolay yolu: Çözümü sağ tıklayın -> Manage NuGet packages for solution-> ConsolidateAynı paketin farklı sürümlerinin kurulu olup olmadığını görebilirsiniz
elshev

16

@Elshev'den yorumlardan birini yineleme Çözüme sağ tıklayın -> Çözüm için NuGet paketlerini yönetin -> Consolidate altında aynı paketin farklı sürümlerinin kurulu olup olmadığını görebilirsiniz. Orada paketleri güncelleyin. Çakışma hatası giderildi.


1
bu benim için çözülmedi. Newtonsoft.JSON'u kaldırıp NuGet aracılığıyla yeniden yüklemem gerekti. Bu diğer paketlerdeki bağımlılıkları güncelledi.
Garr Godfrey

Bu da, DLL'nin eksik referanslarını otomatik olarak ekleyen Resharper gibi araçları kullanırken de başıma geldi. "Her zaman nuget kullanarak ekle" burada iyi bir öneri olabilir.
Shaswat Rungta

Benim için işe yaramıyor çünkü bir paketi kaldırmak için paketler çakışması olduğu için yapılamayacak bir yapı deniyor. Bu yüzden paketi yeniden yükleyemiyorum :(
nickornotto

8

Visual Studio 2017 kullanıyorum ve bazı Nuget paketlerini güncellediğimde bu sorunla karşılaştım. Benim için işe yarayan, dosyamı açmak web.configve <runtime><assemblyBinding>düğümü bulmak ve silmekti. web.configProjeyi kaydedin ve yeniden oluşturun.

Error ListPencereye bak . Bağlanma çatışmaları hakkında çok uzun bir uyarı gibi görünen şeyleri göreceksiniz. Çift tıklayın, <runtime><assemblyBinding>blok otomatik olarak doğru eşlemelerle yeniden oluşturulur .



3

Bu yükleme Newtonsoft Json nugget paketleri ile web projesinde çözebilir


3

Açıkçası bu soruna birçok farklı neden ve dolayısıyla birçok çözüm var. Benimkileri miksata atmak için, daha önce doğrudan Web projemizde referans verilen bir derlemeyi (System.Net.Http) NuGet tarafından yönetilen bir sürüme yükselttik. Bu, söz konusu proje içindeki doğrudan başvuruyu kaldırdı, ancak Test projemiz hala doğrudan başvuruyu içeriyordu. Her iki projeyi de NuGet tarafından yönetilen montajı kullanacak şekilde yükseltmek sorunu çözdü.


2

Paketlerde değişiklik yaptıysanız - sln'yi yeniden açın. Bu benim için çalıştı!


1

Bazen, nuget paketlerinin (tahmin ettiğim şey) kurulacağını gördüm. NET Core gerekli bileşenleri veya zaten yüklü çerçeveyle çakışan diğer öğeleri. Benim çözüm orada proje (.csproj) dosyasını açmak ve bu başvuruları kaldırmak oldu. Örneğin, Microsoft.Bcl yakın zamanda yüklenen bazı NuGet paketleriyle eklendiğinde System.IO, System.Threading ve benzerleri ekleme eğilimindedir. Projelerimin belirli sürümlerinin bir nedeni yok, bu yüzden referansları ve proje yapılarını kaldırıyorum. Umarım yardımcı olur.

Proje dosyanızı "başvuru" için arayabilir ve çakışmaları kaldırabilirsiniz. Sisteme dahil edilmişlerse, onlardan kurtulun ve yapı çalışmalıdır. Bu, bu sorunun tüm vakalarına cevap vermeyebilir - Benim için neyin işe yaradığını bildiğinizden eminim :)

Yorum yaptığımın bir örneği:

<!-- <Reference Include="System.Runtime, Version=2.6.9.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> -->
  <!-- <HintPath>$(SolutionDir)packages\Microsoft.Bcl.1.1.9\lib\net40\System.Runtime.dll</HintPath> -->
  <!-- <Private>True</Private> -->
<!-- </Reference> -->


1

Neyin yanlış olduğunu anlamak için buradaki yanıtların birkaçının tavsiyesini izledim, ancak cevapların hiçbiri nasıl düzeltileceğini açıklamıyordu. Benim sorunum, bir referansın ikinci bir referansın farklı bir versiyonunu gerektirmesiydi. Bu yüzden Newtonsoft sürüm 6'daydı, ancak başka bir DLL 4.5 istiyordu. Sonra önerilen diğer cevaplardan biri olarak Newtonsoft'u yükselttim ve bu da işleri daha da kötüleştirdi.

Bu yüzden aslında Newtonsoft kurulumumu indirdim ve uyarı kayboldu (VS 2017):

Çözüm gezgininde Referanslar'a sağ tıklayın ve NuGet Paketlerini Yönet ... 'i seçin. "Yüklü" sekmesinin altında, Newtonsoft'u (veya çatışmanız ne olursa olsun) bulun. sürümleri. Bu açılır listenin eski sürüme geçmek için kullanılabileceği açık değildi.


1

Sorunu bulmanıza yardımcı olması için Dotnet CLI'yı tam tanı ayrıntılarıyla çalıştırabilirsiniz.

dotnet run --verbosity diagnostic >> full_build.log

Derleme tamamlandığında hatayı günlük dosyasında (full_build.log) arayabilirsiniz. Örneğin, "çatışma" araması sizi doğrudan soruna götürmelidir.


0

NuGet Packagaes'ı yöneten Microsoft ASP.NET MVC nuget.org'u kaldırdım ve tekrar yükledim. Yeniden yüklerken, ustura sürümü ile ilgili tüm çakışmaları çözdü. Dene .


0

MSBuild ayrıntı düzeyini Diagnostic.but olarak değiştirdim, ancak sorunun cevabının nerede olduğunu bulamadım.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="XbimXplorer.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>

Bu yüzden ilk Sistemi, Sürümü 4.0.0.0'dan 12.0.0.0'a değiştirdim ve projem çalıştı.


0

Diğer yanıtlara göre, çıktı günlüğü düzeyini ayrıntılı olarak ayarlayın ve burada bir sonraki adımınıza bakacağınız anlaşmazlıkları arayın.

Benim durumumda, referansların kaynağını arayan beni birkaç yöne gönderdi, ancak sonunda sorunun taşınabilir sınıf kütüphane projelerimden biri olduğu ortaya çıktı, yanlış sürümü hedef alıyordu ve kendi referansların sürümü, dolayısıyla çatışmalar. Hızlı bir yeniden hedefleme ve sorun çözüldü.


0

Ben sadece bu ve nuget yerel başvurulan dlls bir paket değiştirdikten sonra sorun koştu. Sorun eski çalışma zamanı bağlayıcı şeyler oldu app.config.


0

Paket Referansı'na geçtikten sonra bu uyarıyı aldım. Tanı çıktısında kitaplığa aynı kitaplığın kendisi tarafından atıfta bulunulan bilgiler vardı. Yeni bir Paket Referansı hatası olabilir. Çözüm, AutoGenerateBindingRedirects'i etkinleştirmek ve özel bağlama yönlendirmesini silmekti.


0

VS 2017, MVC projesi

Neden bilmiyorum, ama benim için bu sorunun çözümü outdenetleyici eylem yönteminden çağrılan bir model yöntemi imzasından bir parametre kaldırmak oldu. bu çok garip bir davranış ama sorunumun çözümü buydu.


-2

Update-PackagePaket Yöneticisi Konsolu üzerinden komutu çalıştırma

Bu, MSB3277'yi düzeltir, tüm paketleri ve birlikte gelen tüm ilgili derlemeleri yeniden mümkün olan en yüksek sürüme yeniden yükler . Sadece belirli bir paketi güncellemek de mümkündür. Veya güncellemeden sonra sürümüne geçerseniz, bu sorun benim için birkaç kez ortaya çıktı. Kaç tane nuget paketine sahip olduğunuza bağlı olarak, bu işlem birkaç dakika sürebilir.

Resmi dokümanlar hakkında daha fazla bilgi https://docs.microsoft.com/en-us/nuget/consume-packages/reinstal-and-updating-packages


14
Bu tavsiye, genellikle üretim kodu için geçerli olan en son paketleri istemiyorsanız gününüzü mahvedebilir.
Tony O'Hagan

1
Bu, tavsiyede belirtilmiştir ve sizin için neyin bir sorun olabileceği, bir sorunu düzeltmenin güvenli ve kolay bir yoludur, bu yüzden lütfen insanları kendi fikrinize göre düşürmeyin.
Aistis Taraskevicius

1
Bu çözüm benim için işe yaramadı. En son sürümlere zaten sahiptim.
Sıfır3

@ Zero3, doğrudan herhangi bir paket belirtmeden en iyi çözümünüzden çalıştırdınız mı, genellikle işe yarıyor, çünkü her birini yeniden
yükler

3
Bu gerçekten korkunç bir tavsiye. Bu, paketlerin güncellenmesi niyetle yapılmazsa kodu kırar.
TheBatman
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.