Предотвратить код .NET от вызова определенных методов? - PullRequest
6 голосов
/ 17 ноября 2011

Есть ли способ создать ошибки времени компиляции, если вызывается определенный метод?

В качестве примера я хотел бы, чтобы код в определенном проекте не вызывал System.Configuration.ConfigurationManager.AppSettings (). Есть ли способ пометить файл проекта или класса, чтобы вызвать ошибку времени компиляции, если этот метод вызывается?

Я не думаю, что есть, поэтому я думаю, что единственный способ сделать это - создать правило FxCop, которое пометит эти вызовы и сделает это таким образом, но я открыт для других идей.

Я использую .NET 3.5. Не уверен, что контракты кода 4.0 могут сделать это.

Обновление

Я конкретно говорю о методах фреймворка, а не о моих собственных, поэтому я не могу пометить их как устаревшие.

На данный момент мне нет дела до отражения.

Другим примером является System.Web.HttpUtility.HtmlEncode, который я хочу найти и заменить библиотекой Microsoft AntiXss, но я хотел бы интегрировать некоторый процесс проверки на моем сервере сборки, который также проверял бы новый код.

Ответы [ 2 ]

4 голосов
/ 17 ноября 2011

Вы можете написать свои собственные правила в FxCop , так что, возможно, это вариант.

Однако, в этом случае, для существующей кодовой базы вы можете обнаружить, что Ctrl-F (Find) в вашем редакторе для «ConfigurationManager.AppSettings» может выполнять одинаково хорошую работу с гораздо меньшими усилиями ... Что касается Будущее применение, хотя вы могли бы рассмотреть более человеческий путь сообщения электронной почты команде разработчиков ...

Как отмечено выше комментатором и стоит отметить для других с аналогичными целями, что если вы имели в виду функцию в вашей собственной кодовой базе (к которой относится этот вопрос , а не ), вы может использовать атрибут [Obsolete].

2 голосов
/ 17 ноября 2011

Для этого можно использовать инструмент NDepend ( Отказ от ответственности: я являюсь одним из разработчиков инструмента ).

Вы можете написать несколько правил кода через LINQ Queries (CQLinq) , чтобы проверить любой тип зависимости, например, вызов метода.Правила кода могут проверяться в Visual Studio после каждой успешной компиляции, или правила могут также проверяться во время процесса сборки .

Такое правило кода CQLinq может выглядетьнапример:

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

Правило может быть специализированным по своему усмотрению, например, запретить пространствам имен, которые соответствуют регулярному выражению, содержать методы, вызывающие метод получения get_AppSettings():

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

Из NDepend матрицы зависимостей или графика зависимостей вы также можете щелкнуть правой кнопкой мыши по зависимости (ячейка матрицы или стрелка графика) и сгенерировать правило кода, которое предупреждает о существовании зависимости (а затем специализируется).сгенерированное правило, если вам нужно):

enter image description here

...