Udostępnij za pośrednictwem


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

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

Zobacz też