Pracuję nad dużym projektem, a jednym z moich zadań jest usunięcie ewentualnych wycieków pamięci. W moim kodzie zauważyłem, że nie można pozbyć się kilku identyfikowalnych przedmiotów i to naprawiłem. Jednak to prowadzi mnie do bardziej podstawowego pytania, jak znaleźć wszystkie klasy używane w moim projekcie, który implementuje IDisposable? (Nie tworzone niestandardowo klasy, ale standardowe klasy biblioteki, które zostały użyte).
Znalazłem już jedną mniej niż oczywistą klasę, która implementuje IDisposable (DataTable implementuje MarshalByValueComponent, który dziedziczy IDisposable). W tej chwili ręcznie sprawdzam wszelkie podejrzane klasy za pomocą MSDN, ale czy nie jest jakiś sposób, za pomocą którego mogę zautomatyzować ten proces?Jak znaleźć wszystkie klasy implementujące IDisposable?
Odpowiedz
Reflector może pokazać, które klasy wdrożyć IDisposable
: wystarczy zlokalizować interfejs reflektor IDisposable
i rozwinąć „pochodzący typy” węzeł
Inną opcją, z kodu, jest skanowanie wszystkich załadowanych zestawów dla typy realizacji IDisposable
:
var disposableTypes =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where typeof(IDisposable).IsAssignableFrom(t)
select t;
Powyższy fragment kodu skanuje wszystkie załadowane zespoły (zamiast tylko zespołu wykonującego) i nadaje wszystkie typy jednorazowe posortowane według przestrzeni nazw, dlatego bardzo łatwo jest sprawdzić, czy dany typ jednorazowy został pominięty. Tx bardzo mocno :) – apoorv020
Myślę, że coś jak poniższy kod może działać. Musiałby on zostać dostosowany, aby załadować prawidłowy zestaw, jeśli jest uruchamiany z zewnętrznego narzędzia.
Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type type in asm.GetTypes())
{
if(type.GetInterface(typeof(IDisposable).FullName) != null)
{
// Store the list somewhere
}
}
To nie jest dokładnie to, czego szukałem. Ten kod wykonuje pętlę nad typami zdefiniowanymi jako w bieżącym złożeniu, podczas gdy chcę go uruchomić na typach, które są używane w bieżącym złożeniu w postaci.
Mogę łatwo sprawdzić, czy jedna z klas zdefiniowanych w moim projekcie jest IDisposable, jednak chcę sprawdzić, czy standardowe biblioteki klas, które używam narzędzi IDisposable, czy nie. –
apoorv020
@ apoorv020: Powinien być w stanie uruchomić powyższy kod na zespołach szkieletowych .NET (które są przywoływane przez twój projekt), jak myślę, a następnie możesz zapisać listę wszystkiego, co implementuje 'IDisposable', a następnie po prostu wyszukujesz kod źródłowy dla czegokolwiek na tej liście? –
Kod "Thomas Levesque" robi dokładnie to. Dzięki za odpowiedź, wskazała mi to we właściwym kierunku. – apoorv020
spróbować tej kwerendy LINQ:
var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass
select t;
Nie sądzę, że to zadziała, komentarz z MSDN: * Metoda IsSubclassOf nie może być używana do określenia, czy interfejs pochodzi z innego interfejsu, czy klasa implementuje interfejs * –
dzięki za poprawkę. –
testowy projekt z FxCop. Może przechwytywać wszystkie miejsca, w których obiekty IDisposable nie są usuwane. Być może będziesz musiał wykonać pewną pracę, aby wyłączyć wszystkie nieistotne reguły FxCop, pozostawiając tylko reguły związane z IDisposable.
Na przykład, jest to jedna z zasad FxCop IDisposable: http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx
Uwaga: trzeba znaleźć zarówno własne, .NET i osób trzecich obiektów IDisposable, które nie są prawidłowo obsługiwane.
NDepend można użyć do analizy projektu i znaleźć wszystkie typy, które implementują IDisposable.
Here's że kwerenda CQI dla wyniku
SELECT TYPES WHERE Implement "System.IDisposable"
- 1. Jak generować klasy z XSD implementujące serializację?
- 2. Wszystkie typy implementujące określony otwarty typ ogólny
- 3. Jak uczynić obiekt IDisposable zmienną klasy?
- 4. Pozbywanie się członków implementujących IDisposable
- 5. Zadeklarować IDisposable dla klasy lub interfejsu?
- 6. Jak znaleźć wszystkie moduły i klasy w module rekursywnie?
- 7. Jak znaleźć wszystkie bezpośrednie podklasy klasy z .NET Odbicie
- 8. Jak znaleźć wszystkie nieużywane metody klasy w PyCharm?
- 9. IDisposable chain
- 10. Eclipse - znajdź wszystkie klasy rozszerzające interfejs
- 11. jak znaleźć klasy Java?
- 12. Jak znaleźć wszystkie podfoldery folderu?
- 13. Jak znaleźć wszystkie konstruktory statyczne?
- 14. Jak znaleźć wszystkie wystąpienia zmiennej w Vim?
- 15. interfejs Autofac i IDisposable
- 16. Jak znaleźć wszystkie zasoby danego rodzaju?
- 17. Skrót zaćmienia, aby znaleźć wszystkie klasy potomne, które zastępują metodę
- 18. Pobierz tylko właściwości implementujące interfejs
- 19. Jak znaleźć odniesienia do klasy w Eclipse?
- 20. Wykrywanie "wyciekanych" obiektów IDisposable
- 21. Znaleźć wszystkie wykorzystanie stanu sesji
- 22. Implementacja IDisposable w zamkniętej klasie
- 23. Jak znaleźć wszystkie niezaznaczone pola wyboru?
- 24. Jak znaleźć wszystkie rozwiązania celu w Prologu?
- 25. Jak znaleźć wszystkie możliwe wartości wyliczenia?
- 26. Jak znaleźć wszystkie kontrolery i akcje
- 27. Jak znaleźć wszystkie moduły potomne w Pythonie?
- 28. Jak znaleźć wszystkie kwadraty siatki na linii?
- 29. Jak znaleźć wszystkie dane o nieruchomościach?
- 30. jquery usunąć wszystkie klasy z klasy
można powiedzieć, że FxCop? – Arseny