Отключение/исправление предупреждений анализа кода из файлов .Designer.cs

Я активно использую DataVisualization.Charting.Chart, и по большей части он работает. Тем не менее, я часто выполняю анализ кода и позаботился обо всех своих собственных предупреждениях. Но в файлах *.Designer.cs, использующих диаграммы, имеется около 30 CA2000 (объект не расположен по всем путям исключений). Файлы конструктора генерируют почти весь код диаграммы, и почти все элементы диаграммы реализуют IDisposable. У меня есть флажок «Подавлять результаты из сгенерированного кода» в настройках проекта, но он все еще делает это.

Есть ли способ исправить это, не создавая вручную объекты диаграммы и не отключая анализ кода для остального кода в этом классе? Есть ли способ отключить его для всех файлов .Designer.cs? Или есть решение для правильного удаления этих предупреждений, заставив код дизайнера позаботиться об утилизации?


person drharris    schedule 08.08.2011    source источник
comment
см. этот поток stackoverflow .com/questions/4164928/, у него есть несколько хороших идей, даже несмотря на то, что они нацелены на FxCop, человек, XMLForDummies советует попробовать то же самое с анализом кода, стоит посмотреть/попробовать.   -  person Jeremy Thompson    schedule 12.08.2011
comment
Поскольку это уже находится в файле Designer.cs, в него уже встроены эти мелочи. Очевидно, VS Code Analysis даже проверяет файлы Designer, что для меня немного абсурдно; кажется, что они должны решать эти проблемы, а не я! И все же спасибо за ссылку; похоже, что я не единственный, кто получает плохие результаты анализа кода.   -  person drharris    schedule 12.08.2011
comment
Вы должны иметь возможность глобально подавить его в файле глобальных подавлений, нет?   -  person BrainSlugs83    schedule 01.07.2016
comment
Вы можете, но тогда это также отключит его из любого моего пользовательского кода, который я контролирую и должен исправить. Я не могу исправить автоматически сгенерированный код Designer.cs, не сломав Designer. Должна быть возможность отключить все предупреждения CA только из автоматически сгенерированного кода, который я не могу контролировать.   -  person drharris    schedule 16.08.2016


Ответы (4)


Похоже, что немногие разработчики столкнулись с этим безуспешно, так что +1 за хороший вопрос!

Возможное решение состоит в том, чтобы написать метод, который переопределяет CA2000 и подавляет правило, если предупреждение обнаружено в файле конструктора, вот хорошее начало:

Написание пользовательских правил анализа кода в Visual Studio 2010

В противном случае см. комментарии в конце этой темы, инженеры MSFT упоминают о регистрации вызова Connect: http://blogs.msdn.com/b/codeanalysis/archive/2010/03/22/what-s-new-in-code-analysis-for-visual-studio-2010.aspx

person Jeremy Thompson    schedule 15.08.2011
comment
Вау, я действительно не хочу учиться использовать самоанализ, но все больше и больше похоже, что это может быть единственным решением. Я, скорее всего, соглашусь с этим, если никто не откликнется на следующий день или около того. Все еще надеюсь, что этот неуловимый флажок находится где-то глубоко в опциях. :) - person drharris; 15.08.2011
comment
Ладно, похоже, все будет не так уж и плохо. Я ненавижу добавлять кучу кода только для того, чтобы исправить то, что должно работать из коробки, но это лучше, чем засорять каждую сборку 30-40 предупреждениями. Все еще не совсем понял, как выполнить то, что мне нужно сделать, но эти ссылки должны дать мне достаточно, чтобы поэкспериментировать с остальными. Еще раз спасибо! - person drharris; 16.08.2011

Я знаю, что опоздал к этому, но вот.

Я предполагаю, что все эти предупреждения выдаются для кода в методе InitializeComponent? Если да, то рассматривали ли вы возможность изменения файлов шаблонов, расположенных в папке Common7\IDE\ItemTemplates? Вы можете добавить атрибут GeneratedCode к методу в тех. Поскольку атрибут будет установлен только для него, весь остальной ваш код в пределах того же класса все равно будет проверяться анализом кода.

Вот пример файла конструктора Form:

namespace $rootnamespace$
{
    partial class $safeitemrootname$
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        [System.CodeDom.Compiler.GeneratedCode("Windows Form Designer generated code", "1.0.0.0"), System.Diagnostics.DebuggerNonUserCode()]
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Text = "$safeitemrootname$";
        }

        #endregion
    }
}
person Crono    schedule 27.08.2014
comment
Но... нам придется внести это изменение во всех в среде нашей команды, верно? -- В противном случае атрибут [GeneratedCode] будет появляться и исчезать случайным образом... это кажется очень болезненным... -- кроме того, почему бы нам просто не сделать это для всего класса? - person BrainSlugs83; 01.07.2016
comment
Это не исчезнет. Шаблоны используются только для создания документов. После того, как файл создан, им можно поделиться, как и любым другим файлом кода. Если несколько сотрудников должны создавать файлы, то да, каждому из них понадобится шаблон. Но это одноразовая вещь, это не должно иметь большого значения. - person Crono; 01.07.2016
comment
Кроме того, размещение атрибута Generated в классе отключит предупреждения для всех его членов. Сомневаюсь, что ОП захочет этого. - person Crono; 01.07.2016
comment
Дизайнер записывает только в метод InitializeComponent. Это не коснется ничего другого в файле. - person Crono; 01.07.2016
comment
@Crono Неправда, что дизайнер касается кода только методом InitializeComponent. Он также создает переменные-члены. Они также должны быть удалены из проверки кода. Есть идеи по этому поводу? - person Sebastian Schumann; 10.08.2016
comment
@Verarind Вы правы, дизайнер создаст переменные-члены. Однако это будут только объявления, и они не должны вызывать предупреждение CA2000. - person Crono; 10.08.2016
comment
@Crono Да, но он показывает 1591 для отсутствующих комментариев XML :-( - person Sebastian Schumann; 10.08.2016
comment
@Verarind Этого не должно происходить ... если только вы не делаете членов класса, созданных дизайнером, общедоступными, что, ИМХО, приносит совершенно другой запах запахов кода. :) - person Crono; 10.08.2016
comment
@Crono Я сделал его защищенным для получения других форм :-( Нет проблем #pragma warning disable 1591, так как первая строка в Designer.cs решает мою проблему. - person Sebastian Schumann; 10.08.2016

Просто добавьте [SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "..."] к методу Dispose в файле *.Designer.cs.

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

person Dejan    schedule 08.04.2015
comment
У меня больше нет доступа к исходной кодовой базе, чтобы проверить это, но похоже, что теперь это может работать. Кажется, я помню, как пробовал это еще в VS2010, и оно не сохраняло подавление, если вы что-то меняли, так что, возможно, это ошибка, которую они исправили. Надеюсь, это будет полезно другим, рассматривающим эту проблему в будущем! - person drharris; 15.04.2015
comment
Я точно помню, как боролся с этим в более ранних версиях VS, поэтому я почти даже не пытался. Но, похоже, это работает. Надеюсь, это работает во всех случаях. В противном случае, мы услышим об этом здесь. - person Dejan; 16.04.2015

Вы пытались переключить значение свойства «Подавлять результаты из сгенерированного кода» на true на странице свойств «Анализ кода» для вашего проекта (проектов)? Эта опция является стандартным механизмом игнорирования проблем в сгенерированном коде.

Тем не менее, сгенерированный код — это код, который будет выполняться, поэтому игнорирование его нарушений — не обязательно хорошая идея. Учитывая «шумность» CA2000, вы можете вместо этого рассмотреть возможность отключения этого правила.

person Nicole Calinoiu    schedule 09.08.2011
comment
Я вставил в свой первый абзац, что я проверил это без каких-либо улучшений. По-видимому, для того, чтобы это работало, необходимо установить GeneratedCodeAttribute. Проблема в том, что, поскольку файлы Designer.cs являются частичными классами, я держу пари, что этот атрибут не будет работать только для кода дизайнера (т. е. он будет применяться к моему коду в классе, что неприемлемо). Отключить его на самом деле не вариант ... CA2000 спасал меня несколько раз из-за потенциальной блокировки дескриптора файла и подобных проблем; мой код слишком интенсивен для ввода-вывода, чтобы сделать это. Надеясь на способ просто уменьшить шум от MSChart. - person drharris; 10.08.2011