【问题标题】:Disabling/Fixing Code Analysis warnings from .Designer.cs files禁用/修复 .Designer.cs 文件中的代码分析警告
【发布时间】:2015-04-09 07:28:10
【问题描述】:

我正在广泛使用DataVisualization.Charting.Chart,并且大部分情况下它都在工作。但是,我一直在频繁地运行代码分析,并且已经处理了我自己的所有警告。但是,在使用图表的 *.Designer.cs 文件中大约有 30 个 CA2000(对象未沿所有异常路径放置)。 Designer 文件生成了几乎所有的图表代码,并且几乎所有的图表元素都实现了IDisposable。我在项目首选项中选中了“抑制生成代码的结果”,但它仍然可以。

有什么方法可以解决这个问题,无需手动创建图表对象,也无需禁用该类中其余代码的代码分析?有没有办法为所有 .Designer.cs 文件禁用它?或者,是否有解决方案通过让设计器代码负责处理来正确删除这些警告?

【问题讨论】:

  • 看到这个线程stackoverflow.com/questions/4164928/…,它有一些好主意,即使它们是针对 FxCop 的人“XMLForDummies”说要尝试使用代码分析,它值得一看/尝试。
  • 因为它已经在 Designer.cs 文件中,它已经内置了这些小东西。显然 VS Code Analysis 甚至检查 Designer 文件,这对我来说有点荒谬;似乎他们应该是解决这些问题的人,而不是我!不过感谢您的链接;听起来我不是唯一一个得到一些糟糕的代码分析结果的人。
  • 你应该可以在全局抑制中全局抑制它,文件,不是吗?
  • 你可以,但它也会从我的任何自定义代码中禁用它,我可以控制并应该修复它。如果不破坏 Designer,我无法修复 Designer.cs 自动生成的代码。应该有一个选项可以关闭我无法控制的自动生成的代码中的所有 CA 警告。

标签: c# code-analysis idisposable mschart ca2000


【解决方案1】:

似乎有相当多的开发人员遇到这种情况时运气不佳,所以 +1 提出一个好问题!

一个可能的解决方案是编写一个覆盖 CA2000 并在设计器文件中检测到警告时抑制规则的方法,这是一个好的开始:

Writing Custom Code Analysis Rules in Visual Studio 2010

否则看到这个帖子末尾的 cmets,MSFT 工程师提到要记录一个 Connect 调用:http://blogs.msdn.com/b/codeanalysis/archive/2010/03/22/what-s-new-in-code-analysis-for-visual-studio-2010.aspx

【讨论】:

  • 哇,我真的不想学习如何使用 Introspection,但它看起来越来越像这可能是唯一的解决方案。如果第二天左右没有其他人愿意,我可能会接受这个。仍然希望嵌套在选项深处的那个难以捉摸的复选框。 :)
  • 好的,看起来不会太糟糕。我讨厌放入一堆代码来修复一些应该开箱即用的东西,但这比在每个构建中乱扔 30-40 个警告要好。仍然没有完全弄清楚如何完成我需要做的事情,但是这些链接应该让我足够远,可以尝试其余的。再次感谢!
【解决方案2】:

我知道我迟到了,但我来了。

我猜这些警告都是针对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
    }
}

【讨论】:

  • 但是...我们必须对团队环境中的每个人都进行此更改,对吗? -- 否则[GeneratedCode] 属性会随机出现和消失......这看起来真的很痛苦...... - 还有,我们为什么不直接对整个班级做呢?
  • 它不会消失。模板仅用于文档创建。一旦文件被创建,它就可以像任何其他代码文件一样被共享。如果多个同事必须创建文件,那么是的,他们每个人都需要模板。但这是一次性的,应该没什么大不了的。
  • 此外,将 Generated 属性放在类上会禁用其中每个成员的警告。我怀疑 OP 会想要那个。
  • 设计者只写入InitializeComponent方法。它不会触及文件中的任何其他内容。
  • @Crono 设计师只接触InitializeComponent-方法中的代码是不正确的。它还创建成员变量。这些也必须从代码检查中删除。有什么想法吗?
【解决方案3】:

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

我刚刚做了,我发现 VS 2012 足够聪明,即使在设计器中发生更改时重写文件时也能将其保留在那里。

【讨论】:

  • 我什至无法访问原始代码库来验证这一点,但它现在似乎可以工作了。我想我记得在 VS2010 中尝试过这个,如果你改变一些东西,它不会保留抑制,所以也许这是他们修复的一个错误。希望对将来关注此问题的其他人有用!
  • 我当然记得在早期版本的 VS 中遇到过这个问题,所以我几乎没有尝试过。但它似乎工作。我希望,它适用于所有情况。否则,我们会在这里听到。
【解决方案4】:

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

也就是说,生成的代码是会被执行的代码,因此忽略它的违规行为不一定是个好主意。鉴于 CA2000 的“噪音”,您不妨考虑禁用该规则。

【讨论】:

  • 我在第一段中添加了我检查过的内容,但没有任何改进。显然,为了使它起作用,需要设置GeneratedCodeAttribute。问题是,由于 Designer.cs 文件是部分类,我敢打赌该属性不适用于设计器代码(即它会应用于我的类内代码,这是不可接受的)。关闭它真的不是一种选择……由于潜在的文件句柄锁定和类似问题,CA2000 已经多次挽救了我的后方;我的代码太 I/O 密集,无法做到这一点。希望有一种方法可以减少 MSChart 的噪音。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 2018-01-22
相关资源
最近更新 更多