2011-11-16 17 views
6

Czy istnieje sposób tworzenia błędów czasu kompilacji, jeśli wywoływana jest określona metoda?Zapobieganie kodowi .NET wywoływania określonych metod?

Jako przykład, chciałbym uniemożliwić kodowi w konkretnym projekcie wywoływanie System.Configuration.ConfigurationManager.AppSettings(). Czy istnieje sposób na oznaczenie projektu lub pliku klasy w celu zgłoszenia błędu w czasie kompilacji, jeśli ta metoda zostanie wywołana?

Nie sądzę, że tak jest, więc sądzę, że jedynym sposobem na zrobienie tego jest wygenerowanie reguły FxCop, która oznaczałaby te połączenia i robiła to w ten sposób, ale jestem otwarty na inne pomysły.

Używam .NET 3.5. Nie jestem pewien, czy mogą to zrobić umowy kodowe 4.0.

Aktualizacje

jestem specjalnie mówić o metodach ramowych, nie moje, więc nie mogę oznaczyć je jako przestarzałe.

W tym momencie nie dbam o odbicie.

Kolejnym przykładem jest System.Web.HttpUtility.HtmlEncode, który chcę znaleźć i zastąpić biblioteką AntiXss Microsoftu, ale chciałbym zintegrować jakiś proces sprawdzania na moim serwerze kompilacji, który sprawdzi także nowy kod .

+0

Chcesz uniemożliwić wywołanie tej metody poprzez odbicie też? – Vlad

+1

Jeśli był to własny zestaw i można go skompilować, można użyć przestarzałego atrybutu, jeśli to w ogóle pomaga. – asawyer

+0

Dlaczego jest na początku, jeśli nie chcesz, żeby z niego korzystali? –

Odpowiedz

2

Można użyć narzędzia NDepend () Uwaga: Jestem jednym z twórców narzędzia).

Możesz napisać trochę Code Rules over LINQ Queries (CQLinq), aby sprawdzić każdy rodzaj zależności, na przykład wywołanie metody. Reguły kodu mogą być checked in Visual Studio po każdej pomyślnej kompilacji, lub też rules can be checked at build process time.

Taka zasada kod CQLinq może wyglądać następująco:

warnif count > 0 
from m in Application.Methods   
where m.IsUsing("System.Configuration.ConfigurationManager.get_AppSettings()") 
select m 

Zasadą może być specjalnie na wpływem impulsu zabronić np nazw, które pasują do wyrażenia regularnego, zawiera metod, które wywołują sposób get_AppSettings() gettera:

warnif count > 0 
from m in Application.Namespaces.WithNameLike("regex").ChildMethods() 
where m.IsUsing("System.Configuration.ConfigurationManager.get_AppSettings()") 
select m 

z NDepend dependency matrix lub dependency graph, można również kliknąć prawym przyciskiem zależność (komórek macierzy lub wykres strzałka) i wygenerować regułę kod, który ostrzega, gdy zależność istnieje (a następnie specjalizować rządów gen erated jeśli trzeba):

enter image description here

+0

Użyłem tylko Interfejs NDepend. Będę musiał sprawdzić, czy mogę go zintegrować ze skryptami CruiseControl.NET/NAnt build. Czy to jest możliwe? – slolife

+0

Tak, jest to możliwe, przeczytaj nasz dokument związany z integracją z CC.NET: http://www.ndepend.com/Doc_CI_CCNet.aspx –

4

Jesteś w stanie write your own rules in FxCop, więc być może jest to opcja.

Jednak w tym przypadku dla istniejącego kodu bazowego może się okazać, że Ctrl-F (Znajdź) w twoim edytorze dla "ConfigurationManager.AppSettings" może wykonać równie dobrą pracę przy znacznie mniejszym wysiłku ... Z poważaniem do przyszłego egzekwowania, ale możesz rozważyć bardziej ludzką trasę z wiadomością e-mail do zespołu programistycznego ...

Jak podkreślił komentator powyżej i warto zauważyć dla innych o podobnych celach, jest to, że jeśli odnosi się do funkcji we własnej bazie kodu (do której to pytanie jest , a nie), można użyć atrybutu [Obsolete].

+0

Chociaż zgadzam się, że e-mail ** powinien ** działać, chciałbym coś bardziej konkretnego w zakresie walidacji. – slolife

+1

Może zdradzisz zespołowi, któremu zawdzięczamy 6 paczkę piwa dla reszty zespołu za złamanie standardów kodowania !? Z całą powagą, FxCop z niestandardową regułą pomoże ci ją zweryfikować, ale to tylko tak długo, jak serwer (lub serwer budujący) instaluje reguły i używa FxCop poprawnie ... – Reddog