Как программно запустить статический анализ кода в Visual Studio 2017? - PullRequest
0 голосов
/ 25 мая 2018

Я работаю над решением по локализации устаревших приложений.Я написал надстройку для Visual studio с использованием EnvDte, которая автоматизирует процесс установки флага «Localizable» для каждой формы в решении на значение true, что является критически важным шагом для извлечения ресурсов в дизайнерах форм.Сейчас я пытаюсь разобраться с любым текстом, который устанавливается программно, текстом, который вызывает предупреждения Globalization (CA13 ##) .

designer.Visible = true;
var host = (IDesignerHost)designer.Object;
var provider = TypeDescriptor.GetProvider(host.RootComponent);
var typeDescriptor = provider.GetExtendedTypeDescriptor(host.RootComponent);
if (typeDescriptor == null)
    continue;

var propCollection = typeDescriptor.GetProperties();
var propDesc = propCollection["Localizable"];
if (propDesc != null && host.RootComponent != null &&
    (bool?)propDesc.GetValue(host.RootComponent) != true)
{
    try
    {
        propDesc.SetValue(host.RootComponent, true);
    }
    catch (Exception ex)
    {
        // log the error
    }

    // save changes
}

Я смог запустить его вручнуюиз меню: Анализ -> Выполнить анализ кода -> При решении , чтобы получить список проблем, но я хотел бы автоматизировать этот шаг с помощью другой надстройки, которая запускает и извлекает результаты.

Существуют ли какие-либо ресурсы, указывающие на доступ к предупреждениям о сборке или результатам анализа кода?

Существуют ли решения, которые уже делают это, используя EnvDte или Roslyn?

1 Ответ

0 голосов
/ 29 мая 2018

Хорошо, мне удалось собрать достаточно информации, чтобы собрать надстройку.Проще говоря, вы используете _dte.ExecuteCommand()

  1. Инициализируйте команду:

    // nothing to see here...
    _package = package ?? throw new ArgumentNullException(nameof(package));
    
    var commandService = ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    if (commandService == null)
        return;
    _dte = (DTE2)ServiceProvider.GetService(typeof(DTE));
    var menuCommandId = new CommandID(CommandSet, CommandId);
    var menuItem = new MenuCommand(MenuItemCallback, menuCommandId);
    commandService.AddCommand(menuItem);
    
    _events = _dte.Events.BuildEvents;
    // since static code analysis is a sort of build you need to hook into OnBuildDone
    _events.OnBuildDone += OnBuildDone;
    
  2. Запустите анализ

    private void MenuItemCallback(object sender, EventArgs e)
    {
        _dte.ExecuteCommand("Build.RunCodeAnalysisonSolution");
    }
    
  3. Извлечение ошибок в событии OnBuildDone

    private void OnBuildDone(vsBuildScope scope, vsBuildAction action)
    {
        Dispatcher.CurrentDispatcher.InvokeAsync(new Action(() =>
        {
            _dte.ExecuteCommand("View.ErrorList", " ");
            var errors = _dte.ToolWindows.ErrorList.ErrorItems;
            for (int i = 1; i <= errors.Count; i++)
            {
                ErrorItem error = errors.Item(i);
                var code = error.Collection.Item(1);
                var item = new
                {
                    error.Column,
                    error.Description,
                    error.ErrorLevel,
                    error.FileName,
                    error.Line,
                    error.Project
                };
                error.Navigate(); // you can navigate to the error if you wanted to.
            }
        });
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...