Я работаю над крупным проектом, и одна из моих задач состоит в том, чтобы удалить возможные утечки памяти. В моем коде я заметил несколько объектов IDisposable, не избавленных, и зафиксировал это. Однако это приводит меня к более основному вопросу, как я нахожу все классы используемыми в моем проекте та реализация IDisposable? (Не пользовательски созданные классы, но стандартные классы Библиотеки, которые использовались).
Я уже нашел один меньше очевидный класс, который реализует IDisposable (DataTable реализует MarshalByValueComponent, который наследовал IDisposable). Прямо сейчас я вручную проверяю какие-либо подозреваемые классы при помощи MSDN, но не являюсь там некоторым путем, через который я могу автоматизировать этот процесс?
Reflector может показать вам, какие классы реализуют IDisposable
: просто найдите интерфейс IDisposable
в Reflector и разверните узел «Производные типы»
Другой вариант - из кода - сканировать все загруженные сборки на предмет типов, реализующих IDisposable
:
var disposableTypes =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where typeof(IDisposable).IsAssignableFrom(t)
select t;
Проверьте свой проект с помощью FxCop. Он может отловить все места, где объекты IDisposable не утилизируются. Возможно, вам придется проделать некоторую работу, чтобы отключить все нерелевантные правила FxCop, оставив только правила, связанные с IDisposable.
Например, вот одно из правил FxCop для IDisposable: http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx
Примечание: необходимо найти как собственные, .NET, так и сторонние IDisposable объекты, которые обрабатываются некорректно.
Вы можете использовать NDepend , чтобы проанализировать свой проект и найти все типы, реализующие IDisposable.
Вот cql-запрос для результата
SELECT TYPES WHERE Implement "System.IDisposable"
попробуйте этот LINQ-запрос:
var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass
select t;
Я думаю, что что-то вроде приведенного ниже кода может сработать. Правда, его придется подправить, чтобы загрузить правильную сборку при запуске из внешнего инструмента.
Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type type in asm.GetTypes())
{
if(type.GetInterface(typeof(IDisposable).FullName) != null)
{
// Store the list somewhere
}
}