2010-06-07 7 views
18

Je travaille sur un grand projet, et l'une de mes tâches est d'éliminer les possibles fuites de mémoire. Dans mon code, j'ai remarqué que plusieurs éléments IDisposables ne sont pas éliminés, et je l'ai corrigé. Cependant, cela m'amène à une question plus fondamentale, comment puis-je trouver toutes les classes utilisées dans mon projet qui implémente IDisposable? (Classes non personnalisées mais les classes de bibliothèque standard utilisées).
J'ai déjà trouvé une classe moins qu'évidente qui implémente IDisposable (DataTable implémente MarshalByValueComponent, qui hérite de IDisposable). À l'heure actuelle, je vérifie manuellement toutes les classes suspectées à l'aide de MSDN, mais n'y a-t-il pas moyen d'automatiser ce processus?Comment trouver toutes les classes implémentant IDisposable?

+1

peut FxCop dire? – Arseny

Répondre

17

Reflector peut vous montrer quelles classes à mettre en œuvre IDisposable: il suffit de localiser l'interface IDisposable dans le réflecteur, et développez le nœud

Une autre option « types dérivés », à partir du code, est d'analyser tous les ensembles chargés pour les types mise en œuvre IDisposable:

var disposableTypes = 
    from a in AppDomain.CurrentDomain.GetAssemblies() 
    from t in a.GetTypes() 
    where typeof(IDisposable).IsAssignableFrom(t) 
    select t; 
+0

Ce code ci-dessus, scanne tous les assemblages chargés (au lieu de simplement l'assemblage d'exécution) et donne tous les types jetables triés par espace de noms, il est donc très facile de vérifier tout type de jetable que vous avez manqué. Tx beaucoup :) – apoorv020

0

Je pense que quelque chose comme le code ci-dessous pourrait fonctionner. Il devrait être ajusté pour charger l'ensemble correct si exécuté à partir d'un outil externe si.

Assembly asm = Assembly.GetExecutingAssembly(); 
foreach (Type type in asm.GetTypes()) 
{ 
if(type.GetInterface(typeof(IDisposable).FullName) != null) 
{ 
    // Store the list somewhere 
} 
} 
+0

Ce n'est pas exactement ce que je cherchais. Ce code boucle sur les types définis dans l'assemblage actuel, alors que je veux l'exécuter sur les types utilisé dans l'assemblage actuel.
Je peux facilement vérifier si l'une des classes définies dans mon projet incrémente IDisposable, cependant je veux vérifier si les classes de bibliothèque standard que j'utilise implémente IDisposable ou non. – apoorv020

+0

@ apoorv020: Je devrais pouvoir exécuter le code ci-dessus sur les assemblys de framework .Net (tous ceux qui sont référencés par votre projet), et vous pourriez alors enregistrer une liste de tout ce qui implémente 'IDisposable' et ensuite faire une recherche dans votre code source pour quelque chose dans cette liste? –

+0

Le code de "Thomas Levesque" fait exactement cela. Merci pour votre réponse, cependant, il m'a indiqué dans la bonne direction. – apoorv020

0

essayez cette requête LINQ:

var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes() 
         where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass 
         select t; 
+2

Ne pense pas que cela fonctionnerait, commenter de MSDN: * La méthode IsSubclassOf ne peut pas être utilisée pour déterminer si une interface dérive d'une autre interface, ou si une classe implémente une interface * –

+0

merci pour la correction. –

7

Testez votre projet avec FxCop. Il peut capturer tous les endroits où les objets IDisposables ne sont pas éliminés. Vous devrez peut-être faire un peu de travail pour désactiver toutes les règles FxCop non pertinentes, ne laissant que des règles liées à IDisposable.

Par exemple, cela est l'une des règles FxCop IDisposable: http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx

Note: vous devez trouver à la fois vos propres, .NET et tiers objets IDisposable qui ne sont pas traitées correctement.

3

Vous pouvez utiliser NDepend pour analyser votre projet et trouver tous les types qui mettent en œuvre IDisposable.

Here's les __gVirt_NP_NN_NNPS<__ la requête CQL pour le résultat

SELECT TYPES WHERE Implement "System.IDisposable"