MSB3247'yi çözme - Aynı bağımlı derlemenin farklı sürümleri arasında çakışmalar bulundu


427

Bir .NET 3.5 çözümü msbuild ile derlerken bu uyarıyla sonuçlandı.

Bazen NDepend yardımcı olabilir, ancak bu durumda daha fazla ayrıntı vermedi. Bob gibi , bağımlı meclisin eski bir versiyonuna atıfta bulunanı bulana kadar ILDASM'daki her meclisi açmak için başvurmak zorunda kaldım.

VS 2010 Beta 2'den MSBUILD kullanmayı denedim (Connect makalesinin CLR'nin sonraki sürümünde düzeltildiğini belirttiği gibi), ancak bu da daha fazla ayrıntı vermedi (belki Beta 2 sonrası sabit)

Daha iyi (daha otomatik) bir yaklaşım var mı?


2
Benim durumumda, sadece çözümdeki tüm projelerin nuget paketlerinin aynı sürümünü çalıştırdığından emin olmak zorunda kaldım (hepsini en son sürüme güncelleyebilir).
Michael

Yanıtlar:


576

"MSBuild proje derleme çıktı ayrıntı düzeyi", "Ayrıntılı" veya üstü değiştirin. Bunu yapmak için şu adımları izleyin:

  1. Seçenekler iletişim kutusunu açın ( Araçlar -> Seçenekler ... ).
  2. Soldaki ağaçta Projeler ve Çözümler düğümünü seçin ve ardından Oluştur ve Çalıştır'ı seçin .
    • Not: Bu düğüm görünmüyorsa, Tüm ayarları göster iletişim kutusunun altındaki onay kutusunun işaretli olduğundan emin olun .
  3. Görüntülenen araçlar / seçenekler sayfasında , sürümünüze bağlı olarak MSBuild proje derlemesi çıktı ayrıntı düzeyini uygun ayara getirin:

  4. Projeyi derleyin ve çıktı penceresine bakın.

MSBuild iletilerine bakın. ResolveAssemblyReferencesMSB3247 kaynaklanır, bu özel sorunu ayıklamaya yardımcı olmalıdır hangi iştir görev.

Benim özel durum SqlServerCe için yanlış bir başvuru oldu. Aşağıya bakınız. SqlServerCe'nin iki farklı versiyonunu referans alan iki projem vardı. Eski sürümle projeye gittim, referansı kaldırdım, sonra doğru referansı ekledim.

Target ResolveAssemblyReferences:
    Consider app.config remapping of assembly "System.Data.SqlServerCe, ..." 
        from Version "3.5.1.0" [H:\...\Debug\System.Data.SqlServerCe.dll] 
        to Version "9.0.242.0" [C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\System.Data.SqlServerCe.dll]
        to solve conflict and get rid of warning.
    C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets : 
        warning MSB3247: Found conflicts between different versions of the same dependent assembly.

Başvurulan derlemelerin sürümlerini belirlemek için her derlemeyi açmanız gerekmez.

  • Her bir Referansın Özelliklerini kontrol edebilirsiniz.
  • Proje özelliklerini açın ve Başvurular bölümünün sürümlerini kontrol edin.
  • Projeleri bir Metin Düzenleyicisi ile açın.
  • Net Reflektör kullanın.

5
Çözümleriniz bana iyi geliyor, ancak sürüm numaralarını görüntülemek için Referanslar bölümünü kullanmanın her zaman yararlı olduğunu düşünmüyorum. Sık sık VS "yalan" hangi sürümü kullandığım ve hangi sürümü aslında .csproj dosyasında bahsedildiğini gördüm.
David Gardiner

5
@David Gardiner - C # projelerini kullanırken "yalan söyleme" ifadenizi kabul ediyorum. Deneyimlerime göre, C # projeleri başvurulan sürüm ve derlenmiş / bağlanmış gerçek sürüm hakkında karışabilir. Bu olduğunda, çözümü temizler, depo gözü ve nesne klasörlerini el ile silerim, ardından% APPDATA% içindeki geçici proje derlemelerini silerim. Yeniden oluşturma çözümü genellikle sorunu çözer. (VB nadiren bu özel sorundan muzdariptir.)
AMissico

54
İnsanlara Çıktı penceresini gerçekten kullanmalarını bildirmek için kazanın. Derleme F5 + Hata Listesi penceresinden çok daha fazlasıdır.
JJS

2
ErikHeemskerk'in cevabında belirttiği gibi, Visual Studio 2010'da ResolveAssemblyReferences çıktısını görmek için çıktı ayrıntı düzeyini ayrıntılı olarak ayarlamanız gerekecektir.
Robin Clowers

12
İpucu: ayrıntılı derleme çıktısında tam noktayı bulmak için metni bir metin düzenleyicisine kopyalayın, "Aynı bağımlı derlemenin farklı sürümleri arasında çakışma bulundu" ifadesini arayın.
Contango

133

Mike Hadlow etmiştir AsmSpy adlı küçük konsol uygulaması yayınlanmıştır oldukça güzel, her meclis başvuruları listeler:

Reference: System.Net.Http.Formatting
        4.0.0.0 by Shared.MessageStack
        4.0.0.0 by System.Web.Http

Reference: System.Net.Http
        2.0.0.0 by Shared.MessageStack
        2.0.0.0 by System.Net.Http.Formatting
        4.0.0.0 by System.Net.Http.WebRequest
        2.0.0.0 by System.Web.Http.Common
        2.0.0.0 by System.Web.Http
        2.0.0.0 by System.Web.Http.WebHost

Bu, MSB3247 uyarısının alt kısmına ulaşmak için MSBuild çıkışına bağlı olmaktan çok daha hızlı bir yoldur.


1
AsmSpy harika, sadece uyumsuz sürümleri olan üçüncü taraf DLL'lere referanslar aradığınızı hatırlamanız gerekir. Genellikle, standart kitaplıklara yapılan başvurulardaki uyumsuz sürümler bu uyarılara neden olmaz (ve bunları çok görürsünüz).
Tod Thomson

Bu, sorunumu hemen çözmeme yardımcı olan harika bir araç. Benim durumumda, ancak, tam olarak üçüncü taraf DLL değil, mscorlib.dll farklı başvuruları vardı System.Management.Automation.dll referansları.
Chris Gillum

Araç güzel, ancak her koşulda çalışmıyor. En azından bir .NET 4.5 projesi için benim için çarpışan referans sürümlerini göstermedi. + msbuild çıktısı, söz konusu DLL'leri yollar ve tümü ile adlandırır.
twomm

11
Nazik sözler çocuklar için teşekkürler :)
Mike Hadlow

Bana birkaç saat çalıştın! Ayrıntılı çıktıyı okumak yardımcı oldu, ancak bir kez yaptıktan sonra aracınızla tekrar doğrulamak kolaydı.
Norman H

22

Bazen @AMissico yanıtı yeterli değil. Benim durumumda, Çıktı pencerelerinde hatayı bulamadım, bu yüzden aşağıdaki adımları uygulayarak bir günlük dosyası oluşturmaya ve analiz etmeye karar verdim:

  1. Derleme günlüğünü bir dosyaya kaydetme ... https://msdn.microsoft.com/en-us/library/ms171470.aspx

    msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed

  2. Metni bulun: warning MS...veya özel uyarı bilgilerini: (örn. Satır 9293) Found conflicts between different versions...ve çakışma hatasının tüm ayrıntıları bu iletinin üstünde olacaktır (örneğin, satır 9277)There was a conflicts between... Hata mesajını bulun

Visual Studio 2013


Çıktıda 3277'yi aramak için harika bir ipucu.
sfuqua

21

Sorunu tespit edebilmek için (en azından Visual Studio 2010'da) çıkış ayrıntı düzeyini en az Ayrıntılı olarak ayarlamanız gerektiğini buldum.

Sorunum, daha önce bir GAC referansı olan bir referanstı, ancak makinemin yeniden yüklenmesinden sonra artık böyle değildi.


1
Çıktı ayrıntı düzeyini ayarlamak için Araçlar-> Seçenekler-> Projeler ve Çözümler-> Oluştur ve Çalıştır'a gidin.
Farshid

8

Aynı hatayla karşılaştım ve diğer cevaplarla çözemedim. NuGet paketlerini "Birleştirebileceğimizi" buldum.

  1. Çözüme sağ tıklayın
  2. Nuget Paketlerini Yönet'i tıklayın
  3. Sekmeyi birleştirin ve aynı sürüme güncelleyin.

7

Varsayılan ASP.NET MVC 4 beta için oluşturulan bu uyarı buraya bakın

İçinde, bu Uyarı herhangi bir döküm projeniz için .csproj dosyasını elle düzenleyerek ortadan kaldırılabilir.

değiştir ........: Reference Include = "System.Net.Http"

okumak için ......: Reference Include = "System.Net.Http, Sürüm = 4.0.0.0"


1
Bunu takip ettim ve hata kayboldu. Hala nasıl veya neden bilmiyorum, VS2010 ile bir MVC 4 projesi başlattım ve VS2012'ye geçtim. Ancak, sürüm özniteliğini ekleyerek hatayı kaybettiniz. Teşekkürler
MaiOM

6

Bağımlılık okuyucu kullanma

Dep.exe'yi kullanarak bir klasörün tüm iç içe bağımlılıklarını listeleyebilirsiniz. Grep veya awk gibi unix araçlarıyla birlikte, sorununuzu çözmenize yardımcı olabilir

Birden fazla sürümde referans alınan derlemeleri bulma

$ dep | awk '{ print $1 " " $2; print $4 " " $5 }' | awk '{ if (length(versions[$1]) == 0) versions[$1] = $2; if (versions[$1] != $2) errors[$1] = $1; }  END{ for(e in errors) print e } ' 
System.Web.Http            

Bu belirsiz komut satırı dep.exe'yi çalıştırır ve ardından çıkışı

  • ebeveyn ve alt öğeyi tek bir sütuna koyun (varsayılan olarak her satırda bu ebeveynin o çocuğa bağlı olduğu gerçeğini ifade etmek için bir ebeveyn ve çocuk bulunur)
  • sonra ilişkilendirilebilir bir dizi kullanarak bir tür 'gruplama' yapın

Bu montajın çöp kutusuna nasıl çekildiğini anlama

$ dep myproject/bin | grep -i System\.Web\.Http
MyProject-1.0.0.0 >> System.Web.Http.Web-5.2.3.0 2 ( FooLib-1.0.0.0 )
MyProject-1.0.0.0 >> System.Web.Http.Web-4.0.0.0 2 ( BarLib-1.0.0.0 )
FooLib-1.0.0.0 > System.Web.Http.Web-5.2.3.0 1
BarLib-1.0.0.0 > System.Web.Http.Web-4.0.0.0 1 

Bu örnekte, araç System.Web.Http 5.2.3'ün FooLib'e bağımlılığınızdan, 4.0.0 sürümü ise BarLib'den geldiğini gösterir.

Sonra aralarında seçim yapabilirsiniz

  • kütüphanelerin sahiplerini aynı versiyonu kullanmaya ikna etmek
  • birini kullanmayı bırak
  • en son sürümü kullanmak için yapılandırma dosyanıza bağlayıcı yönlendirmeler ekleme

Windows'da bu şey nasıl çalıştırılır

Eğer bir unix tipi kabuk yoksa çalıştırmak için önce bir tane indirmeniz gerekir awkve grep. Aşağıdakilerden birini deneyin


4

Ben de bu sorunu vardı ve AMissico'nın tavsiye de sorunu keşfetmek kullanılır (Her ne kadar ayrıntı düzeyini Ayrıntılı ayarlamak zorunda kaldı.

Suçluyu bulduktan sonra sorun aslında oldukça basitti.

Arka plan: Projemi VS2008'den VS2010'a yükselttim. VS2008'de hedef çerçeve 3.5'ti ve VS2010'a getirdiğimde 4'e (Tam) geçtim. Crystal raporları da dahil olmak üzere bazı üçüncü taraf bileşenleri de yeni sürüme geçirdim.

Sürüm 4.0.0.0'ı işaret eden ancak bir çiftin otomatik olarak değiştirilmediği (System ve System.Web.Services) Sistem referanslarının çoğunun ortaya çıktığı ve hala 2.0.0.0'a baktığı ortaya çıktı. Kristal raporları 4.0.0.0'a atıfta bulunuyor ve bu yüzden çatışmalar meydana geliyordu. Basitçe imleci çözüm gezginindeki ilk Sistem kütüphanesine koyarak, imleci listeden aşağıya indirin ve 2.0.0.0 referanslarını aramak, yeni 4.0.0.0 sürümünü kaldırmak ve yeniden eklemek hile yaptı.

Garip bu, referansların çoğunun doğru şekilde güncellenmiş olmasıydı ve Crystal raporları olmasaydı, muhtemelen hiç fark etmeyecektim ...



2

Belirtildiği gibi burada , kullanılmayan başvuruları kaldırmanız gerekir ve uyarılar gidecek.


1

ASP.NET oluşturma yöneticisi, klasörleri alfabetik olarak inceleyerek web sitesini oluşturuyor ve her klasör için bağımlılıkları anlıyor ve önce bağımlılıkları sonra da seçilen klasörü oluşturuyor.

Bu durumda, ~ / Controls olan sorunlu klasör başlangıçta oluşturulacak şekilde seçilmiştir, ancak bilinmeyen bir nedenden ötürü, bazı kontrolleri diğer kontrollerle aynı montajın yerine ayrı bir montaj olarak oluşturur ( bazı denetimlerin aynı klasördeki diğer denetimlere bağlı olmasına bağlı).

Daha sonra oluşturulan bir sonraki klasör (~ / File-Center / Control) ~ / Controls'e bağlı olan kök klasöre ~ / bağlıdır, bu nedenle ~ / Controls klasörü sadece bu sefer ayrılan kontroller tekrar oluşturulur. kendi derlemelerine şimdi ayrılmış düzeneğe başvurulmakta olan diğer kontrollerle aynı düzene katılırlar.

Böylece bu noktada 2 montajı (en azından) aynı kontrollere sahiptir ve yapı başarısız olur.

Bunun neden olduğunu hala bilmememize rağmen, Controls klasör adını ZControls olarak değiştirerek bu sorunu çözebildik, bu şekilde ~ / File-Center / Control'dan önce oluşturulmadı, ancak sonra ve bu şekilde oluşturuldu olması gerektiği gibi.


1

Hızlı düzeltme:

Çözümü 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. Farklı sürümleri kaldırın ve en son sürümü yükleyin.


1

Bazen AutoGenerateBindingRedirectsyeterli bile değil GenerateBindingRedirectsOutputType. Tüm There was a conflictgirişleri aramak ve bunları tek tek elle düzeltmek sıkıcı olabilir, bu yüzden günlük çıktısını ayrıştıran ve sizin için üreten küçük bir kod parçası yazdım stdout:

// Paste all "there was a conflict" lines from the msbuild diagnostics log to the file below
const string conflictFile = @"C:\AssemblyConflicts.txt";

var sb = new StringBuilder();
var conflictLines = await File.ReadAllLinesAsync(conflictFile);
foreach (var line in conflictLines.Where(l => !String.IsNullOrWhiteSpace(l)))
{
    Console.WriteLine("Processing line: {0}", line);

    var lineComponents = line.Split('"');
    if (lineComponents.Length < 2) 
        throw new FormatException("Unexpected conflict line component count");

    var assemblySegment = lineComponents[1];
    Console.WriteLine("Processing assembly segment: {0}", assemblySegment);
    var assemblyComponents = assemblySegment
                              .Split(",")
                              .Select(kv => kv.Trim())
                              .Select(kv => kv.Split("=")
                              .Last())
                              .ToArray();

    if (assemblyComponents.Length != 4) 
        throw new FormatException("Unexpected conflict segment component count");

    var assembly = assemblyComponents[0];
    var version = assemblyComponents[1];
    var culture = assemblyComponents[2];
    var publicKeyToken = assemblyComponents[3];

    Console.WriteLine("Generating assebmly redirect for Assembly={0}, Version={1}, Culture={2}, PublicKeyToken={3}", assembly, version, culture, publicKeyToken);
    sb.AppendLine($"<dependentAssembly><assemblyIdentity name=\"{assembly}\" publicKeyToken=\"{publicKeyToken}\" culture=\"{culture}\" /><bindingRedirect oldVersion=\"0.0.0.0-{version}\" newVersion=\"{version}\" /></dependentAssembly>");
}

Console.WriteLine("Generated assembly redirects:");
Console.WriteLine(sb);

İpucu: MSBuild İkili ve Yapısal Günlük Görüntüleyicisi'ni kullanın ve projede yalnızca uyarı there was a conflictgönderen çakışmalar için bağlayıcı yönlendirmeler oluşturun (yani, yalnızca yukarıdaki kod için [ AssemblyConflicts.txt] giriş metin dosyasına bu satırları geçerek ).


0

(İç) bağımlılıkları dikkate almadan biri olmadan en basit yol:

  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ı ile ilgili bir sorun vardı. Her nasılsa, mevcut tüm referansların listesi altında üç versiyonunu listeleyebilirim. Yukarıdaki 1'den 6'ya kadar olan süreci takip ettim ve bu benim için çalıştı.



0

Yeniden birleştirici varsa, çözümünüzdeki kullanılmayan tüm referansları kaldırın.

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.