2011-08-08 30 views
12

Estoy usando DataVisualization.Charting.Chart ampliamente, y en su mayor parte está funcionando. Sin embargo, he estado ejecutando Code Analysis con frecuencia y he tenido todas mis advertencias a cargo. Sin embargo, hay aproximadamente 30 CA2000 (objeto no eliminado a lo largo de todas las rutas de excepción) en los archivos * .Designer.cs que usan la creación de gráficos. Los archivos de Designer están generando casi todo el código de gráficos, y casi todos los elementos de gráficos implementan IDisposable. He marcado "Suprimir resultados del código generado" en las preferencias del proyecto, pero todavía lo hace.Deshabilitar/corregir advertencias de análisis de código de archivos .Designer.cs

¿Hay alguna manera de arreglar esto, sin tener que crear manualmente los objetos de gráfico, y sin deshabilitar el análisis de código para el resto del código en esa clase? ¿Hay alguna manera de deshabilitarlo para todos los archivos .Designer.cs? ¿O existe una solución para eliminar estas advertencias correctamente haciendo que el código del diseñador se ocupe de la eliminación?

+0

ver este hilo http://stackoverflow.com/questions/4164928/how-to-suppress-code-analysis-on-generatedcode, tiene algunas buenas ideas, aunque están dirigidas a FxCop la persona "XMLForDummies" dice que intente lo mismo con Code Analysis, vale la pena verlo/probarlo. –

+0

Dado que esto ya se encuentra en un archivo Designer.cs, ya tiene esas pequeñas cosas incorporadas. Al parecer VS Code Analysis incluso comprueba los archivos de Designer, lo que para mí es un poco absurdo; parece que deberían ser ellos los que arreglan esos problemas, ¡no yo! Gracias por el enlace; Parece que no soy el único que obtiene algunos resultados de análisis de código incorrecto. – drharris

+0

Debería poder suprimirlo globalmente en las supresiones globales, archivo, ¿no? – BrainSlugs83

Respuesta

2

Parece que algunos desarrolladores lo han encontrado sin suerte, así que +1 para una buena pregunta!

Una posible solución es escribir un método que CA2000 y de anulación suprime la regla si se detecta la advertencia en un archivo de diseño, aquí es un buen comienzo:

Writing Custom Code Analysis Rules in Visual Studio 2010

De lo contrario ver los comentarios al final de este hilo, los ingenieros de MSFT mencionan para registrar una llamada de Connect: http://blogs.msdn.com/b/codeanalysis/archive/2010/03/22/what-s-new-in-code-analysis-for-visual-studio-2010.aspx

+0

Guau, realmente no quiero aprender a usar Introspection, pero parece cada vez más como esta podría ser la única solución. Probablemente acepte este si nadie más habla en el próximo día más o menos. Todavía esperando que esa caja esquiva anidara en algún lugar en lo profundo de las opciones. :) – drharris

+1

Ok, parece que no será tan malo. Odio poner un montón de código solo para arreglar algo que debería funcionar de la caja, pero es mejor que ensuciar cada construcción con 30-40 advertencias. Todavía no he descubierto completamente cómo lograr lo que necesito hacer, pero estos enlaces me deberían llevar lo suficientemente lejos como para experimentar con el resto. ¡Gracias de nuevo! – drharris

0

¿Ha intentado alternar el valor de propiedad "Suprimir resultados del código generado" a verdadero en la página de propiedades de Análisis de código para su (s) proyecto (s)? Esta opción es el mecanismo estándar para ignorar problemas en el código generado.

Dicho esto, el código generado es código que se ejecutará, por lo que ignorar sus violaciones no es necesariamente una gran idea. Dado el "ruido" de CA2000, es posible que desee considerar deshabilitar la regla en su lugar.

+2

Puse en mi primer párrafo que lo había revisado sin ninguna mejora. Aparentemente para que eso funcione, el 'GeneratedCodeAttribute' necesita establecerse. El problema es que como los archivos Designer.cs son parciales, apuesto a que el atributo no funcionaría solo para el código de diseñador (es decir, se aplicaría a mi código de clase, lo cual es inaceptable). Desactivarlo realmente no es una opción ... CA2000 ha salvado mi parte trasera más de unas pocas veces debido al posible bloqueo del manejador de archivos y problemas similares; mi código es demasiado intensivo de E/S para hacer eso. Esperando una forma de reducir el ruido de MSChart. – drharris

1

Sé que llego tarde a esto, pero aquí va.

Supongo que todas estas advertencias se emiten para el código dentro del método InitializeComponent? Si es así, ¿ha considerado modificar los archivos de plantilla ubicados en la carpeta Common7 \ IDE \ ItemTemplates? Podría agregar el atributo GeneratedCode en el método en esos. Como el atributo se establecerá solo en él, todos los demás códigos dentro de la misma clase seguirán siendo verificados por el análisis del código.

He aquí un ejemplo de archivo de Form diseñador:

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 
    } 
} 
+0

Pero ... tendríamos que hacer este cambio en todos en el entorno de nuestro equipo, ¿verdad? - De lo contrario, el atributo '[GeneratedCode]' aparecerá y desaparecerá al azar ... eso parece muy doloroso ... - también, ¿por qué no deberíamos hacerlo a toda la clase? – BrainSlugs83

+0

No desaparecerá. Las plantillas solo se usan para la creación de documentos. Una vez que se crea el archivo, se puede compartir tal cual, como cualquier otro archivo de código. Si varios compañeros de trabajo deben crear archivos, entonces sí, cada uno de ellos necesitaría la plantilla. Pero es algo de una sola vez, no debería ser un gran problema. – Crono

+0

Además, al colocar el atributo Generado en la clase se inhabilitarían las advertencias para cada miembro dentro de él. Dudo que OP quiera eso. – Crono

1

sólo tiene que añadir un [SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "..."] al método Dispose en su archivo * .Designer.cs.

Acabo de hacerlo, y he descubierto que VS 2012 es lo suficientemente inteligente como para mantenerlo allí incluso cuando se reescribió el archivo cuando algo se modificó en el diseñador.

+0

Ya no tengo acceso a la base de código original para verificar esto, pero parece que puede funcionar ahora. Creo que recuerdo haber intentado esto en VS2010, y no retendría la supresión si cambias algo, así que tal vez este es un error que arreglaron. Esperemos que sea útil para otros que miren esto ¡problema en el futuro! – drharris

+0

Ciertamente recuerdo haber tenido problemas con esto en versiones anteriores de VS, así que casi ni siquiera lo intenté. Pero parece funcionar. Espero que funcione en todos los casos. Escucharemos sobre esto aquí. – Dejan

Cuestiones relacionadas