13

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

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

4

4 回答 4

2

相当多的开发人员似乎在没有运气的情况下遇到了这个问题,所以 +1 是一个好问题!

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

在 Visual Studio 2010 中编写自定义代码分析规则

否则请参阅此线程末尾的评论,MSFT 工程师提到记录 Connect 调用:http: //blogs.msdn.com/b/codeanalysis/archive/2010/03/22/what-s-new-in-代码分析-for-visual-studio-2010.aspx

于 2011-08-15T05:10:54.453 回答
1

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

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

于 2015-04-08T23:28:10.857 回答
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
    }
}
于 2014-08-27T14:10:29.320 回答
0

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

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

于 2011-08-09T14:08:54.053 回答