2010-06-07 4 views
18

Ich arbeite an einem großen Projekt, und eine meiner Aufgaben besteht darin, mögliche Speicherlecks zu entfernen. In meinem Code habe ich festgestellt, dass mehrere IDisposable-Elemente nicht entsorgt werden, und habe das behoben. Das führt mich jedoch zu einer grundlegenderen Frage, wie finde ich alle Klassen in meinem Projekt verwendet, die IDisposable implementieren? (Keine benutzerdefinierten Klassen, sondern Standardbibliotheksklassen, die verwendet wurden).
Ich habe bereits eine weniger als offensichtliche Klasse gefunden, die IDisposable implementiert (DataTable implementiert MarshalByValueComponent, das IDisposable erbt). Momentan überprüfe ich manuell verdächtige Klassen mithilfe von MSDN, aber gibt es keinen Weg, durch den ich diesen Prozess automatisieren kann?Wie finde ich alle Klassen, die IDisposable implementieren?

+1

kann FxCop sagen? – Arseny

Antwort

17

Reflector können Sie zeigen, welche Klassen implementieren IDisposable: nur die IDisposable Schnittstelle in Reflector lokalisieren, und erweitern Sie die „Abgeleitete Typen“ Knoten

Eine weitere Möglichkeit, von Code ist alle geladenen Baugruppen für Typen IDisposable Implementierung zu scannen:

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

Dieser Codeabschnitt scannt alle geladenen Assemblys (statt nur die ausführende Assembly) und sortiert alle verfügbaren Typen nach dem Namespace, so dass es sehr einfach ist, nach verpassten Wegwerftypen zu suchen. Tx sehr viel :) – apoorv020

0

Ich denke, etwas wie der folgende Code könnte funktionieren. Es müsste angepasst werden, um die korrekte Baugruppe zu laden, wenn sie von einem externen Werkzeug ausgeführt wird.

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

Dies ist nicht genau das, was ich gesucht habe. Dieser Code wird über die Typen definiert in der aktuellen Baugruppe, während ich es über die Typen in der aktuellen Baugruppe ausführen möchte.
Ich kann leicht überprüfen, ob eine der in meinem Projekt implementierten Klassen IDisposable ist, jedoch möchte ich überprüfen, ob die von mir verwendeten Standardbibliotheksklassen IDisposable implementieren oder nicht. – apoorv020

+0

@ apoorv020: Sollte in der Lage sein, den obigen Code auf den .Net-Framework Assemblies (alle, die von Ihrem Projekt verwiesen werden) auch ich würde denken, und dann könnten Sie eine Liste von allem, die 'IDisposable' und dann implementiert Suchen Sie einfach in Ihrem Quellcode nach etwas in dieser Liste? –

+0

Der Code von "Thomas Levesque" macht genau das. Danke für deine Antwort, aber es hat mich in die richtige Richtung gezeigt. – apoorv020

0

versuchen, diese LINQ-Abfrage:

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

Glauben Sie nicht, dass das funktionieren würde, Kommentar von MSDN: * Die IsSubclassOf-Methode kann nicht verwendet werden, um festzustellen, ob eine Schnittstelle von einer anderen Schnittstelle abgeleitet ist oder ob eine Klasse eine Schnittstelle * –

+0

Dank für die Korrektur implementiert. –

7

Testen Sie Ihr Projekt mit FxCop. Es kann alle Stellen erfassen, an denen IDisposable-Objekte nicht entsorgt werden. Möglicherweise müssen Sie einige Arbeiten ausführen, um alle irrelevanten FxCop-Regeln zu deaktivieren und nur IDisposable-bezogene Regeln zu belassen.

Zum Beispiel ist dies eine der FxCop IDisposable Regeln: http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx

Hinweis: Sie müssen sowohl eigene Faust zu finden, .NET und Fremd IDisposable Objekte, die nicht richtig behandelt werden.

3

können Sie NDepend verwenden Ihr Projekt zu analysieren und alle Arten, die IDisposable implementieren finden.

Heres die die cql Abfrage für das Ergebnis

SELECT TYPES WHERE Implement "System.IDisposable"