Zestaw zbieralny w obiekcie AssemblyLoadContext, który nie jest zbieralny
Program .NET niepoprawnie zezwolił na zbieranie elementów bezużytecznych w celu rozwiązania problemu z niezbierzemnym AssemblyLoadContextelementem . W niektórych przypadkach prowadzi to do awarii środowiska uruchomieniowego lub nieoczekiwanych NullReferenceException wyjątków. Ta zmiana zapobiega nieprawidłowemu zachowaniu, zgłaszając wyjątek, gdy AssemblyLoadContext.Load(AssemblyName) zdarzenie lub AssemblyLoadContext.Resolving zwraca element zbieralny Assembly i nie AssemblyLoadContext jest zbieralny.
Poprzednie zachowanie
Zwracanie danych zbieralnych Assembly w AssemblyLoadContext.Load(AssemblyName) przesłonięcie lub AssemblyLoadContext.Resolving zdarzenie, które nie jest zbierane AssemblyLoadContext , nie powoduje zgłaszania żadnych wyjątków.
Nowe zachowanie
Zwracanie elementu zbieralnego Assembly w AssemblyLoadContext.Load(AssemblyName) przesłonięcie lub AssemblyLoadContext.Resolving zdarzenie, które nie jest zbierane AssemblyLoadContext , zgłasza System.IO.FileLoadExceptionNotSupportedException wyjątek wewnętrzny jako wyjątek wewnętrzny.
Wprowadzona wersja
.NET 7
Typ zmiany powodującej niezgodność
Ta zmiana może mieć wpływ na zgodność binarną.
Przyczyna wprowadzenia zmiany
Ta zmiana naprawia usterkę. Element zbieralny Assembly będzie zbierany na śmieci, podczas gdy AssemblyLoadContext element, który ma odwołanie do niego, jest żywy w pozostałej części okresu istnienia procesu. Jeśli kod uruchomiony w tym kontekście odwołuje się do niczego z tego Assembly
po zebraniu, spowoduje to awarię środowiska uruchomieniowego lub spowodowanie nieprawidłowego zachowania.NullReferenceExceptionAccessViolationException
Zalecana akcja
Nie zwracaj zestawów zbieralnych w AssemblyLoadContext.Load(AssemblyName) ani AssemblyLoadContext.Resolving w przypadku niezbierznych AssemblyLoadContextzestawów. Możliwe obejście polega na zmianie AssemblyLoadContext
elementu , który ma być zbieralny, przekazując true
parametr isCollectible
w jego konstruktorze, a następnie zachować odwołanie do tego na zawsze, aby upewnić się, że AssemblyLoadContext
nigdy nie został zebrany.
Dotyczy interfejsów API
- System.Runtime.Loader.AssemblyLoadContext.Load(AssemblyName)
- System.Runtime.Loader.AssemblyLoadContext.Resolving Zdarzenie