2010-06-07 29 views
18

Estoy trabajando en un proyecto grande, y una de mis tareas es eliminar posibles fugas de memoria. En mi código, he notado que varios artículos descartables no se han eliminado, y lo he solucionado. Sin embargo, eso me lleva a una pregunta más básica, ¿cómo puedo encontrar todas las clases usadas en mi proyecto que implementen IDisposable? (No clases creadas a medida, sino clases de biblioteca estándar que se han utilizado).
Ya he encontrado una clase menos obvia que implementa IDisposable (DataTable implementa MarshalByValueComponent, que hereda IDisposable). En este momento, estoy verificando manualmente cualquier clase sospechosa mediante el uso de MSDN, pero ¿no hay alguna forma de automatizar este proceso?¿Cómo encontrar todas las clases que implementan IDisposable?

+1

puede decir que FxCop? – Arseny

Respuesta

17

Reflector se puede mostrar qué clases implementan IDisposable: Sólo localice la interfaz IDisposable en el reflector, y se expanden los "tipos derivados" nodo

Otra opción, a partir del código, es escanear todos los ensamblados cargados para este tipo de aplicación de IDisposable:

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

Esta pieza de código anterior escanea todos los ensamblajes cargados (en lugar de solo el ensamblaje que se está ejecutando) y da todos los tipos desechables ordenados por espacio de nombres, por lo que es muy fácil buscar cualquier tipo desechable que se haya perdido. Tx mucho :) – apoorv020

0

Creo que algo así como el siguiente código podría funcionar. Sin embargo, tendría que ajustarse para cargar el ensamblaje correcto si se ejecuta desde una herramienta externa.

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

Esto no es exactamente lo que estaba buscando. Este código pasa por encima de los tipos definidos en el ensamblaje actual, mientras que deseo ejecutarlos sobre los tipos que son utilizados en el ensamblaje actual.
Puedo verificar fácilmente si una de las clases definidas en mis proyectos es IDisposable, sin embargo, quiero verificar si las clases de biblioteca estándar que estoy utilizando implementan IDisposable o no. – apoorv020

+0

@ apoorv020: Debería ser capaz de ejecutar el código anterior en los ensamblados .Net framework (cualquiera que sea referenciado por su proyecto) así como yo lo pensaría, y luego podría guardar una lista de todo lo que implemente 'IDisposable' y luego simplemente haga una búsqueda a través de su código fuente para cualquier cosa en esa lista? –

+0

El código de "Thomas Levesque" hace exactamente eso. Gracias por su respuesta, sin embargo, me indicó la dirección correcta. – apoorv020

0

Intentar esta consulta LINQ:

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

No creas que eso funcionaría, comenta MSDN: * El método IsSubclassOf no se puede usar para determinar si una interfaz se deriva de otra interfaz, o si una clase implementa una interfaz * –

+0

gracias por la corrección. –

7

prueba su proyecto con FxCop. Puede atrapar todos los lugares donde no se eliminan los objetos identificables. Es posible que deba hacer algún trabajo para desactivar todas las reglas irrelevantes de FxCop, dejando solo reglas relacionadas con IDisposable.

Por ejemplo, esta es una de las reglas FxCop IDisposable: http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx

Nota: es necesario encontrar tanto en su propio, .NET y objetos de terceros IDisposable que no se manejan correctamente.

3

puede utilizar NDepend para analizar su proyecto y encontrar todos los tipos que implementan IDisposable.

tope aquí tienes la consulta CQL para el resultado

SELECT TYPES WHERE Implement "System.IDisposable" 
Cuestiones relacionadas