Assembly pouvant être collecté dans AssemblyLoadContext ne pouvant pas être collecté

.NET a autorisé de manière incorrecte les assemblys de mémoire pouvant être collecté à résoudre en un assembly ne pouvant pas être collecté AssemblyLoadContext. Dans certains cas, cela entraîne des blocages d’exécution ou des exceptions inattendues NullReferenceException. Ce changement empêche le comportement incorrect en levant une exception lorsque l’événement AssemblyLoadContext.Load(AssemblyName) ou AssemblyLoadContext.Resolving retourne un Assembly pouvant être collecté et le AssemblyLoadContext ne pouvant pas être collecté.

Comportement précédent

Le renvoi d’un élément pouvant être collecté Assembly dans le remplacement AssemblyLoadContext.Load(AssemblyName) ou l’événement AssemblyLoadContext.Resolving d’un AssemblyLoadContext ne pouvant pas être collecté n’entraîne pas de levée d’exceptions.

Nouveau comportement

Le renvoi d’un Assembly pouvant être collecté dans le remplacement de AssemblyLoadContext.Load(AssemblyName) ou l’événement AssemblyLoadContext.Resolving d’un AssemblyLoadContext ne pouvant pas être collecté lève un System.IO.FileLoadException avec une NotSupportedException en tant qu’exception interne.

Version introduite

.NET 7

Type de changement cassant

Ce changement peut affecter la compatibilité binaire.

Raison du changement

Ce changement corrige un bogue. Le Assembly pouvant être collecté serait collecté par la mémoire alors que le AssemblyLoadContext qui a une référence à celui-ci est actif pour le reste de la durée de vie du processus. Si le code en cours d’exécution dans ce contexte fait référence à quoi que ce soit de ce Assembly après sa collecte, il bloque le runtime ou entraîne un NullReferenceException, AccessViolationException, ou d’autres types de comportement incorrect.

Ne retournez pas d’assemblys pouvant être collectés dans l’événement AssemblyLoadContext.Load(AssemblyName) ou AssemblyLoadContext.Resolving d’un AssemblyLoadContext ne pouvant pas être collecté. Une solution de contournement possible consiste à modifier le AssemblyLoadContext à collecter en passant true vers le paramètre isCollectible dans son constructeur, puis à conserver une référence à ce AssemblyLoadContext pour toujours pour s’assurer qu’il n’est jamais collecté.

API affectées

Voir aussi