Как найти все Классы, реализовав IDisposable?

Я работаю над крупным проектом, и одна из моих задач состоит в том, чтобы удалить возможные утечки памяти. В моем коде я заметил несколько объектов IDisposable, не избавленных, и зафиксировал это. Однако это приводит меня к более основному вопросу, как я нахожу все классы используемыми в моем проекте та реализация IDisposable? (Не пользовательски созданные классы, но стандартные классы Библиотеки, которые использовались).
Я уже нашел один меньше очевидный класс, который реализует IDisposable (DataTable реализует MarshalByValueComponent, который наследовал IDisposable). Прямо сейчас я вручную проверяю какие-либо подозреваемые классы при помощи MSDN, но не являюсь там некоторым путем, через который я могу автоматизировать этот процесс?

17
задан Cœur 12 August 2017 в 09:34
поделиться

5 ответов

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;
18
ответ дан 30 November 2019 в 12:50
поделиться

Проверьте свой проект с помощью FxCop. Он может отловить все места, где объекты IDisposable не утилизируются. Возможно, вам придется проделать некоторую работу, чтобы отключить все нерелевантные правила FxCop, оставив только правила, связанные с IDisposable.

Например, вот одно из правил FxCop для IDisposable: http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx

Примечание: необходимо найти как собственные, .NET, так и сторонние IDisposable объекты, которые обрабатываются некорректно.

7
ответ дан 30 November 2019 в 12:50
поделиться

Вы можете использовать NDepend , чтобы проанализировать свой проект и найти все типы, реализующие IDisposable.

Вот cql-запрос для результата

SELECT TYPES WHERE Implement "System.IDisposable"
3
ответ дан 30 November 2019 в 12:50
поделиться

попробуйте этот LINQ-запрос:

var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes()
                      where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass
                      select t;
0
ответ дан 30 November 2019 в 12:50
поделиться

Я думаю, что что-то вроде приведенного ниже кода может сработать. Правда, его придется подправить, чтобы загрузить правильную сборку при запуске из внешнего инструмента.

Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type type in asm.GetTypes())
{
 if(type.GetInterface(typeof(IDisposable).FullName)  != null)
 {
  // Store the list somewhere
 }
}
0
ответ дан 30 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: