2010-04-17 18 views
287

%windir%\Microsoft.NET\assembly\ to nowy GAC. Czy to znaczy, że teraz musimy zarządzać dwoma GACami, jednym dla aplikacji .NET 2.0-3.5, a drugim dla aplikacji .NET 4.0?.NET 4.0 ma nowy GAC, dlaczego?

Pytanie brzmi, dlaczego?

+6

dziękuję za pytanie. Jestem także bardzo zdezorientowany, gdy nie znalazłem gac w jego oryginalnej lokalizacji :) – Jasl

+2

Dobre pytanie ... Wielkie dzięki. – smwikipedia

+1

+1 za pytanie. Rozpocząłem rozwój w NET 4.0 i byłem zdezorientowany przez "podwójny" problem z GAC. –

Odpowiedz

174

Tak, ponieważ istnieją 2 oddzielne pamięci podręczne Global Assembly Cache (GAC), będziesz musiał zarządzać każdym z nich osobno.

W .NET Framework 4.0, GAC przeszedł kilka zmian. GAC został podzielony na dwa, po jednym dla każdego CLR.

Wersja CLR używana w systemach .NET Framework 2.0 i .NET Framework 3.5 to CLR 2.0. W poprzednich dwóch wydaniach ramowych nie było potrzeby podziału GAC. Problem łamania starszych aplikacji w Net Framework 4.0.

Aby uniknąć problemów między CLR 2.0 a CLR 4.0, GAC jest teraz dzielony na prywatne GAC dla każdego środowiska wykonawczego. Główną zmianą jest to, że aplikacje CLR v2.0 nie mogą teraz widzieć złożeń CLR v4.0 w GAC.

Source

Dlaczego?

Wygląda na to, że nastąpiła zmiana CLR w .NET 4.0, ale nie w wersjach od 2.0 do 3.5. To samo stało się z wersją 1.1 do 2.0 CLR. Wydaje się, że GAC ma możliwość przechowywania różnych wersji złożeń, o ile są one z tego samego CLR. Nie chcą łamać starych aplikacji.

Zobacz następujące informacje w MSDN about the GAC changes in 4.0.

Na przykład, jeśli zarówno .NET 1.1 i .NET 2.0 podzielił samo GAC, to aplikacja .NET 1.1, ładowanie zespół z tego wspólne GAC, mógł dostać .NET 2.0 zespoły, tym samym łamiąc .NET 1.1 Aplikacja

Wersja CLR używana zarówno dla .NET Framework 2.0, jak i .NET Framework 3.5 to CLR 2.0. W wyniku tego, nie było potrzebne w poprzednich dwóch wydaniach ramowych , aby podzielić GAC. Problem zerwania starsze (w tym przypadku, .NET 2.0) aplikacje resurfaces w Net Framework 4.0 w , które wskazują CLR 4.0 wydany. W związku z tym, , aby uniknąć zakłóceń między CLR 2.0 i CLR 4.0, GAC jest teraz podzielony na prywatne GAC dla każdego środowiska wykonawczego .

Podczas aktualizacji CLR w przyszłych wersjach można oczekiwać tego samego. Jeśli zmieni się tylko język, możesz użyć tego samego GAC.

+16

Ten wpis na blogu stanowi jedynie przypomnienie o OP, nie wyjaśnia, dlaczego * GAC musiał zostać podzielony. Nie jest oczywiste, że pierwotny GAC byłby w stanie utrzymać 4 oddzielne złożenia.Mają nowe [AssemblyVersion] –

+1

@Hans: Może nie jest to dokładny powód, ale mówi: "Aby uniknąć problemów między CLR 2.0 a CLR 4.0", również pytanie zawierało 2 pytania. Drugie pytanie brzmi: "czy to znaczy, że teraz musimy zarządzać dwoma GACami, jednym dla aplikacji .NET 2.0-3.5, a drugim dla aplikacji .NET 4.0?" –

+2

Powinieneś zacytować to z jednego z twoich linków: "Na przykład, jeśli zarówno .NET 1.1, jak i .NET 2.0 dzielą ten sam GAC, wówczas aplikacja .NET 1.1, ładując zestaw z tego współużytkowanego GAC, może uzyskać .NET 2.0 złożeń, co powoduje przerwanie aplikacji .NET 1.1. " –

63

To nie ma większego sensu, oryginalny GAC był już dość zdolny do przechowywania różnych wersji złożeń. I nie ma powodu, aby zakładać, że program kiedykolwiek przypadkowo odwoła się do niewłaściwego zestawu, wszystkie zestawy .NET 4 otrzymały wynik [AssemblyVersion] do 4.0.0.0. Nowa funkcja przetwarzania równoległego nie powinna tego zmieniać.

Moje przypuszczenie: było już zbyt wiele projektów .NET, które złamały zasadę "nigdy nie odwołuj się bezpośrednio do GAC".Widziałem to kilka razy na tej stronie.

Tylko jeden sposób, aby uniknąć zerwania tych projektów: przenieść GAC. Back-compat jest święte w Microsoft.

+3

Jest to jedyna odpowiedź, która próbuje wyjaśnić, * dlaczego * tak jest. +1 –

+1

@Hans Passant: Co rozumiesz przez zasadę "nigdy nie odwołuj się do niczego w GAC bezpośrednio"? –

+2

@Max: na twoim komputerze znajdują się dwie kopie zestawów .NET. Te, które miały być zestawami referencyjnymi w zestawach c: \ windows \ microsoft.net i c: \ program files \ reference. A te używane w czasie wykonywania, GAC @ c: \ windows \ assembly. Nie są one takie same, 64-bitowy byłby przykładem. Microsoft dołożył wszelkich starań, aby uniknąć odniesienia się do GAC z obsługą rozszerzenia powłoki. I okno Dodaj odniesienie. Nie w 100% skuteczne –

64

Chciałem wiedzieć, dlaczego 2 GAC i stwierdzono następujące explanation by Mark Miller w comments section z .NET 4.0 has 2 Global Assembly Cache (GAC):

Mark Miller powiedział ... 28 czerwca 2010 12:13

Dzięki za post. "Problemy z zakłóceniami" były celowo niejasne. W czasie pisania sprawy były nadal badane, ale było jasne, że było kilkoma zepsutymi scenariuszami.

Na przykład niektóre aplikacje używają nazwy Assemby.LoadWithPartialName w celu załadowania najwyższej wersji zespołu. Jeśli najwyższa wersja została skompilowana z v4, to aplikacja v2 (3.0 lub 3.5) może nie załadować go, a aplikacja zawiesi się, , nawet gdyby istniała wersja, która zadziałałaby pod . Oryginalnie, podzielił GAC pod jego oryginalną lokalizacją na , ale to spowodowało pewne problemy ze scenariuszami aktualizacji do systemu Windows . Oba te obejmowały kodu że już wysłane, więc przenieśliśmy nasze (wersja na partycje GAC do innym miejscu.

To nie powinno mieć żadnego wpływu na większość aplikacji, a nie dodawać żadnych konserwacji ciężarem. Obie lokalizacje powinny być dostępne lub zmodyfikowane wykorzystując natywne API GAC tylko, które zajmują z podziału zgodnie z oczekiwaniami. w miejsca, gdzie to robi powierzchni są poprzez API, które narażają ścieżki GAC takie jak GetCachePath, lub zbadanie ścieżki mscorlib załadowanej do zarządzanego kodu.

Warto zauważyć, że zmodyfikowane GAC lokalizacje kiedy wydaliśmy v2 oraz kiedy wprowadziliśmy architekturę jako części identyczności montażowej. Te dodały GAC_MSIL, GAC_32 i GAC_64, , mimo że wszystkie nadal należały do ​​zestawu % windir% \. Niestety, ta nie była opcją dla tego wydania.

Mam nadzieję, że pomoże przyszłym czytelnikom.

+3

Komentarze Millera na temat połączonego artykułu przedstawiają wgląd do tego tematu. –