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.
Action recommandée
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
- System.Runtime.Loader.AssemblyLoadContext.Load(AssemblyName)
- ÉvénementSystem.Runtime.Loader.AssemblyLoadContext.Resolving
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour