禁用/修复.Designer.cs文件中的代码分析警告

13

我广泛使用 DataVisualization.Charting.Chart,在大多数情况下它都可以正常工作。但是,我经常运行代码分析,并已解决所有自己的警告。然而,在使用图表的 *.Designer.cs 文件中有大约30个 CA2000 (对象在所有异常路径上未被处理)。设计文件生成几乎所有图表代码,几乎所有的图表元素实现了 IDisposable 接口。我已经在项目首选项中启用了 "Suppress results from generated code",但是它仍然会出现这些警告。

是否有办法修复它,而无需手动创建图表对象,也不需要禁用该类中其余代码的代码分析? 是否有办法禁用所有 .Designer.cs 文件的代码分析? 或者,通过使设计器代码处理处理来正确地消除这些警告的解决方案是什么?


请查看此线程https://dev59.com/32855IYBdhLWcg3wvnKE,其中有一些好的想法,尽管它们是针对FxCop的,但“XMLForDummies”建议尝试使用Code Analysis,这值得一试。 - Jeremy Thompson
由于这已经在Designer.cs文件中,它已经内置了那些小东西。显然,VS Code分析甚至检查Designer文件,对我来说有点荒谬;似乎他们应该修复这些问题,而不是我!不过还是谢谢你提供的链接;听起来好像我不是唯一一个得到一些糟糕的代码分析结果的人。 - drharris
你应该能够在全局抑制文件中全局抑制它,对吧? - BrainSlugs83
你可以这样做,但那也会禁用我控制并应该修复的任何自定义代码。我无法在不破坏设计器的情况下修复Designer.cs自动生成的代码。应该有一个选项可以关闭所有CA警告,仅针对我无法控制的自动生成代码。 - drharris
4个回答

2

哇,我真的不想学习如何使用内省,但看起来这可能是唯一的解决方案。如果在接下来的一天左右没有其他人提出意见,我可能会接受这个解决方案。仍然希望那个深藏在选项中的难以捉摸的复选框。 :) - drharris
1
好的,看起来情况不会太糟。我不喜欢只是为了修复一些应该可以直接使用的东西而将大量代码放进去,但这总比每次构建都要面对30-40个警告要好。我还没有完全弄清楚如何完成我需要做的事情,但这些链接应该足以让我继续实验其他的部分。再次感谢! - drharris

1
我知道我来晚了,但还是来试一试。
我猜测这些警告都是在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
    }
}

@Crono,设计师不仅在“InitializeComponent”方法中触及代码是不正确的。它还创建成员变量。这些也必须从代码检查中删除。有什么想法吗? - Sebastian Schumann
@Verarind 你是正确的,设计师将会创建成员变量。但是这些只会是声明,不应该引起CA2000警告的出现。 - Crono
@Crono 是的,但是它显示 1591 表示缺少 XML 注释 :-( - Sebastian Schumann
@Verarind 这不应该发生...除非你将设计师生成的类成员公开,这会带来另一种代码异味。 :) - Crono
@Crono 我将其设置为受保护以派生其他表单 :-( 没问题,将 #pragma warning disable 1591 作为 designer.cs 中的第一行即可解决我的问题。 - Sebastian Schumann
显示剩余4条评论

1

只需在*.Designer.cs文件的Dispose方法中添加[SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "...")]即可。

我刚刚这样做了,发现即使在设计师中更改了某些内容并重新编写文件,VS 2012也足够聪明,可以将其保留在那里。


我甚至已经无法访问原始代码库来验证这一点,但现在似乎可以工作了。我记得在VS2010中尝试过这个,如果你改变了某些东西,它不会保留抑制,所以也许这是一个他们修复的错误。希望对未来遇到这个问题的其他人有用! - drharris
我肯定记得在早期版本的VS中遇到过这个问题,所以我几乎没有尝试过。但它似乎可以工作。我希望它在所有情况下都能正常工作。否则,我们会在这里听到反馈的。 - Dejan

0

你尝试过在项目的代码分析属性页面中将“抑制生成代码结果”属性值切换为true吗? 这个选项是忽略生成代码问题的标准机制。

话虽如此,生成的代码是将要执行的代码,所以忽略它的违规行为不一定是一个好主意。考虑到CA2000的“嘈杂程度”,您可能希望禁用该规则。


2
我在第一段中提到,我已经检查过了,但没有改善。显然,为了使其工作,需要设置GeneratedCodeAttribute。问题是,由于Designer.cs文件是部分类,我敢打赌这个属性不会仅适用于设计师代码(即它将应用于我的类内代码,这是不可接受的)。关闭它真的不是一个选择... CA2000已经多次拯救了我,因为可能存在文件句柄锁定和类似问题;我的代码对I/O的需求太高了,无法做到那样。希望能找到一种方法来减少MSChart的噪音。 - drharris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接