Rozwiązanie .NET 3.5 zakończyło się tym ostrzeżeniem podczas kompilacji z msbuild.
Czasami NDepend może pomóc, ale w tym przypadku nie podał żadnych dalszych szczegółów. Podobnie jak Bob, musiałem uciekać się do otwierania każdego zestawu w ILDASM, dopóki nie znalazłem tego, który odwoływał się do starszej wersji zestawu zależnego.
Próbowałem użyć MSBUILD z VS 2010 Beta 2 (jak wskazał artykuł Connect w następnej wersji CLR), ale nie dostarczyło to również żadnych szczegółów (być może naprawiono po Beta 2)
Czy istnieje lepsze (bardziej zautomatyzowane) podejście?
Odpowiedzi:
Zmień „Szczegółowość danych wyjściowych kompilacji projektu MSBuild” na „Szczegółowe” lub wyżej. Aby to zrobić, wykonaj następujące kroki:
Na wyświetlonej stronie narzędzi / opcji ustaw poziom szczegółowości wyjściowej kompilacji projektu MSBuild na odpowiednie ustawienie w zależności od wersji:
Sprawdź wiadomości MSBuild.
ResolveAssemblyReferences
Zadanie, które jest zadaniem, z którego pochodzi MSB3247 powinno pomóc debugowania tego konkretnego problemu.Mój konkretny przypadek był niepoprawnym odniesieniem do SqlServerCe. Patrz poniżej. Miałem dwa projekty odwołujące się do dwóch różnych wersji SqlServerCe. Poszedłem do projektu ze starszą wersją, usunąłem referencję, a następnie dodałem poprawną referencję.
Nie trzeba otwierać każdego zestawu, aby określić wersje zespołów, do których istnieją odniesienia.
źródło
Mike Hadlow opublikował małą aplikację konsolową o nazwie AsmSpy, która dość ładnie wymienia odniesienia do każdego zestawu:
Jest to znacznie szybszy sposób dotarcia do dolnej części ostrzeżenia MSB3247, niż poleganie na danych wyjściowych MSBuild.
źródło
Kiedyś odpowiedź @AMissico nie wystarczy. W moim przypadku nie mogłem znaleźć błędu w oknach danych wyjściowych, dlatego postanowiłem utworzyć plik dziennika i przeanalizować go, wykonując następujące czynności:
Zapisywanie dziennika kompilacji w pliku ... https://msdn.microsoft.com/en-us/library/ms171470.aspx
msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed
Znajdź tekst:
warning MS...
lub szczegółowe informacje ostrzegawcze: (np. Wiersz 9293),Found conflicts between different versions...
a pełne szczegóły błędu konfliktu znajdą się nad tym komunikatem (np. Wiersz 9277)There was a conflicts between...
Visual Studio 2013
źródło
Odkryłem, że (przynajmniej w Visual Studio 2010) musisz ustawić szczegółowość wyjściową na co najmniej Szczegółową, aby móc wykryć problem.
Być może moim problemem było odwołanie, które wcześniej było odniesieniem GAC, ale nie było już tak po ponownej instalacji mojego komputera.
źródło
Miałem ten sam błąd i nie mogłem go zrozumieć z innymi odpowiedziami. Odkryłem, że możemy „konsolidować” pakiety NuGet.
źródło
To ostrzeżenie wygenerowane dla domyślnej wersji ASP.NET MVC 4 beta, patrz tutaj
źródło
Użyj czytnika zależności
Korzystanie z dep.exe można wyświetlić listę wszystkich zagnieżdżonych zależności całego folderu. W połączeniu z narzędziami uniksowymi, takimi jak grep lub awk, może pomóc rozwiązać problem
Znajdowanie zestawów, do których istnieją odniesienia w więcej niż jednej wersji
Ten niejasny wiersz poleceń uruchamia dep.exe, a następnie przesyła dane wyjściowe dwukrotnie, aby uzyskać awk
Zrozumienie, w jaki sposób ten zestaw został wciągnięty do kosza
W tym przykładzie narzędzie pokazuje, że System.Web.Http 5.2.3 pochodzi z zależności od FooLib, podczas gdy wersja 4.0.0 pochodzi z BarLib.
Następnie masz wybór między
Jak uruchomić te rzeczy w systemie Windows
Jeśli nie masz powłoki typu unix, musisz ją pobrać przed uruchomieniem
awk
i uruchomieniemgrep
. Wypróbuj jedną z poniższych opcjiźródło
Miałem też ten problem i skorzystałem z porad AMissico, aby odkryć problem (chociaż musiałem ustawić poziom szczegółowości na Szczegółowy.
Problem był jednak całkiem prosty po znalezieniu winowajcy.
Tło: Zaktualizowałem swój projekt z VS2008 do VS2010. W VS2008 docelowy framework był 3.5, a kiedy wprowadziłem go do VS2010, zmieniłem go na 4 (pełny). Uaktualniłem także niektóre komponenty stron trzecich, w tym raporty Crystal.
Okazało się, że większość odniesień do systemu wskazywała na wersję 4.0.0.0, ale kilka nie zostało automatycznie zmienionych (System i System.Web.Services) i nadal patrzyło na 2.0.0.0. Raporty Crystal odnoszą się do 4.0.0.0, a więc w tym miejscu występowały konflikty. Wystarczy umieścić kursor na pierwszej bibliotece Systemu w eksploratorze rozwiązań, przesunąć kursor w dół listy i poszukać odniesień do 2.0.0.0, usunąć i ponownie dodać nowszą wersję 4.0.0.0.
Dziwne, że większość referencji została poprawnie zaktualizowana i gdyby nie raporty Crystal, prawdopodobnie nigdy bym nie zauważył ...
źródło
Zrobiłem aplikację na podstawie aplikacji Mike'a Hadlowa: AsmSpy .
Moja aplikacja jest aplikacją WPF z graficznym interfejsem użytkownika i można ją pobrać z mojego domowego serwera internetowego: AsmSpyPlus.exe .
Kod jest dostępny na: GitHub
źródło
Jak wspomniano tutaj , musisz usunąć nieużywane odniesienia, a ostrzeżenia znikną.
źródło
Menedżer kompilacji ASP.NET buduje stronę internetową, przeglądając foldery alfabetycznie, i dla każdego folderu odkrywa zależności i najpierw buduje zależności, a następnie wybrany folder.
W tym przypadku problematyczny folder, który jest ~ / Controls, został wybrany do zbudowania na początku, z jeszcze nieznanego powodu, buduje tam niektóre formanty jako oddzielny zestaw zamiast w tym samym zestawie, co inne formanty (wydaje się, że być powiązanym z faktem, że niektóre kontrolki zależą od innych kontrolek w tym samym folderze).
Następnie następny budowany folder (~ / File-Center / Control) jest zależny od folderu głównego ~ /, który jest zależny od ~ / Controls, więc folder ~ / Controls jest budowany ponownie tylko tym razem, które zostały rozdzielone do własnego zestawu są teraz połączone z tym samym zestawem, co inne elementy sterujące, a do oddzielnego zestawu wciąż się odwołuje.
Więc w tym momencie zestaw 2 (przynajmniej) ma te same elementy sterujące i kompilacja kończy się niepowodzeniem.
Chociaż nadal nie wiemy, dlaczego tak się stało, byliśmy w stanie obejść ten problem, zmieniając nazwę folderu Controls na ZControls, w ten sposób nie jest on budowany przed ~ / File-Center / Control, tylko później i w ten sposób jest budowany jak powinno.
źródło
Szybka naprawa:
Kliknij prawym przyciskiem myszy rozwiązanie -> Zarządzaj pakietami NuGet dla rozwiązania -> W obszarze Konsoliduj możesz sprawdzić, czy zostały zainstalowane różne wersje tego samego pakietu. Odinstaluj różne wersje i zainstaluj najnowszą.
źródło
Czasami
AutoGenerateBindingRedirects
to nie wystarcza (nawet przyGenerateBindingRedirectsOutputType
). Wyszukiwanie wszystkichThere was a conflict
wpisów i ręczne ich poprawianie jeden po drugim może być żmudne, dlatego napisałem mały fragment kodu, który analizuje dane wyjściowe dziennika i generuje je dla ciebie (zrzuty dostdout
):Wskazówka: używaj MSBuild Binary and Structured Log Viewer i generuj tylko przekierowania wiązania dla konfliktów w projekcie, który emituje ostrzeżenie (to znaczy, tylko za tymi
there was a conflict
liniami do wejściowego pliku tekstowego dla kodu powyżej [AssemblyConflicts.txt
]).źródło
Najprostszy sposób bez uwzględnienia (wewnętrznych) zależności:
W moim przypadku wystąpił problem z referencją MySQL. Jakoś mógłbym wymienić trzy jego wersje pod listą wszystkich dostępnych referencji. Postępowałem zgodnie z powyższą procedurą od 1 do 6 i zadziałało to dla mnie.
źródło
Dodatek Visual Studio for Mac Community:
Ponieważ odpowiedź AMissico wymaga zmiany poziomu dziennika i ani ASMSpy, ani ASMSpyPlus nie są dostępne jako rozwiązanie wieloplatformowe, oto krótkie uzupełnienie programu Visual Studio dla komputerów Mac:
Jest w społeczności Visual Studio → Preferencje ... → Projekty → Kompiluj dziennik → gadatliwość
źródło
Jeśli masz resharper, usuń wszystkie nieużywane odniesienia w swoim rozwiązaniu.
źródło