c# .net visual-studio code-contracts

c# - ¿Cómo puedo hacer que los Contratos de Código ignoren una referencia de ensamblaje específica?



.net visual-studio (3)

¿Ha intentado algo con: [assembly: Contracts.ContractVerification(false)] en el nivel de ensamblaje?

Debería poder hacerlo dinámicamente: https://msdn.microsoft.com/en-us/library/bb458043.aspx

Espero que esto ayude,

Estoy haciendo una extensión para Visual Studio. Dentro del código, estoy usando los Contratos de Código para hacer afirmaciones y verificaciones. Puse el nivel de opción de advertencia en alto.

Lo que me gustaría hacer es mantener ese nivel de advertencia e ignorar las comprobaciones realizadas en las referencias de EnvDTE.

Considere el siguiente ejemplo de código:

public static string GetAbsoluteOutputFolder(EnvDTE.Project project) { if (project == null) throw new ArgumentNullException("project"); var path = project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString(); //... }

Con mi configuración actual, CC me requeriría agregar las siguientes comprobaciones antes de asignar la variable de path :

Contract.Assume(project.ConfigurationManager != null); Contract.Assume(project.ConfigurationManager.ActiveConfiguration != null); Contract.Assume(project.ConfigurationManager.ActiveConfiguration.Properties != null);

Por lo tanto, lo que me gustaría hacer aquí es decirle a CC que "confíe" en EnvDTE e ignore estos tipos y sus propiedades.

Pensé que la opción CC "Ser optimista en API externa" cumplía este propósito; Resulta que no lo hace.

¿Hay alguna manera de hacer que se comporte de la manera que quiero que no requiera un nivel de advertencia más bajo ?

EDITAR: Quiero una solución que funcione a nivel de proyecto y que todavía permita que se realicen verificaciones "regulares".


No creo que sea posible resolver el problema pero desde C # 6.0 hay una solución que al menos alivia el dolor un poco:

En lugar de

Contract.Assume(project.ConfigurationManager != null); Contract.Assume(project.ConfigurationManager.ActiveConfiguration != null); Contract.Assume(project.ConfigurationManager.ActiveConfiguration.Properties != null);

ahora puedes escribir

Contract.Assume(project.ConfigurationManager?.ActiveConfiguration?.Properties != null);


No se puede proporcionar una solución detallada, pero esto debería solucionarse utilizando la función de línea de base o System.Diagnostics.CodeAnalysis.SuppressMessage en el nivel de ensamblaje:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", "Whatever")]

Puede usar la propiedad "Destino" de SuppressMessageAttribute para ignorar solo el mensaje en tipos / métodos / espacios de nombres específicos:

[SupressMessage("Microsoft.Contracts", "CC1055", Scope="Member", Target="YouNamespace.EnvDTE.Project"]

Tenga en cuenta que los Parámetros que utilicé son solo una buena apuesta, tendrá que averiguar el Alcance, el Id. De Mensaje y el Destino correctos :) En una nota al margen, creo que el Atributo es Condicional ("CODE_ANALYSIS").

La solución oficial sugerida para este problema es crear algún tipo de envoltorio, en su caso probablemente un repositorio que crearía o contendría sus objetos EnvDTE.Project. A continuación, puede agregar el Contrato requerido. Asegura allí.