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í.