Как написать правило анализа кода (FxCop), чтобы предотвратить вызов метода - PullRequest
6 голосов
/ 16 марта 2009

Как мне написать инструмент анализа кода для vs2008, чтобы предотвратить вызов конкретной платформы, такой как GC.WaitForFullGCComplete () или Application.DoEvents ()

Я попытался переопределить VisitMethodCall в своем собственном правиле, но я не могу понять, что на самом деле имеет параметр Microsoft.FxCop.Sdk.MethodCall. Не удалось найти пример в Интернете.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 4 ]

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

Замените System.Web.HttpUtility.HtmlEncode(System.String) на сигнатуру метода, которую вы пытаетесь найти и предотвратить.

    public override ProblemCollection Check(Member member)
    {
        if (member is Method)
        {
            var callees = new List<Method>(Callees.CalleesFor((Method)member));
            foreach (var callee in callees)
            {
                if (callee.FullName == "System.Web.HttpUtility.HtmlEncode(System.String)")
                {
                    Problems.Add(new Problem(GetResolution()));
                }
            }
        }

        return Problems;
    }
0 голосов
/ 19 октября 2010

Альтернативой беспорядку написания правил FxCop было бы использование инструмента NDepend. Этот инструмент позволяет писать правила кода для запросов C # LINQ , что мы называем CQLinq . Отказ от ответственности: я один из разработчиков инструмента

По умолчанию предлагается более 200 правил кода . Настроить существующие правила или создать свои собственные правила просто благодаря хорошо известному синтаксису C # LINQ .

Как написать инструмент анализа кода для vs2008, чтобы предотвратить вызов определенного фреймворка, такой как GC.WaitForFullGCComplete () или Application.DoEvents ()

Для этой конкретной потребности достаточно простого следующего правила CQLinq (обратите внимание на использование AllowNoMatch () , чтобы это правило работало в любой ситуации):

// <Name>Don't call these methods</Name>
warnif count > 0
from m in Methods 
where m.IsUsing ("System.GC.WaitForFullGCComplete()".AllowNoMatch()) ||
      m.IsUsing ("System.GC.WaitForFullGCComplete(Int32)".AllowNoMatch()) ||
      m.IsUsing ("System.Windows.Forms.Application.DoEvents()".AllowNoMatch())
select m

CQLinq-запросы можно редактировать в реальном времени в VisualStudio и предлагать мгновенный результат с возможностями просмотра результатов:

enter image description here

Давайте уточним, что правила можно проверить вживую в Visual Studio и во время процесса сборки, в сгенерированном отчете HTML + javascript .

0 голосов
/ 30 декабря 2010

Хотя это не соответствует ни NDepend, ни даже самому FxCop, я только что опубликовал очень легкий подход, который хорошо работает для простых вещей, таких как предотвращение вызовов определенных методов: http://activesharp.codeplex.com/wikipage?title=Using%20ActiveSharp%20as%20a%20Unit%20Test%20Tool

0 голосов
/ 16 марта 2009

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

...