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