c# - generate - Los contratos de código no parecen funcionar en VS2012
params comments c# (2)
Entonces, el problema parecía ser una combinación de varias limitaciones y errores con los Contratos de Código. Espero que esta respuesta ayude a gente como yo a comenzar.
En primer lugar, los contratos de código son compatibles con Visual Studio 2012 (cualquier versión distinta de Express) desde la compilación 1.4.50327.0, aunque tiene que ejecutar devenv.exe /setup
si su compilación es anterior a la 1.4.50910.0. Consulte las Notas de la versión para obtener más información.
El primer problema que tuve fue que la casilla de verificación "Resultados de caché" estaba marcada en la sección "Comprobación estática" de la pestaña de propiedades de Contratos de código. Esta opción está activada de forma predeterminada, y también requiere que SQL Server CE almacene sus datos almacenados en caché, que no están instalados por Windows 8, VS2012 o los contratos de código. Desafortunadamente, su programa continuará compilando muy bien, y tendría que ir a excavar manualmente a través de la salida de compilación para ver el error:
CodeContracts: xxx: Excepción no controlada: System.IO.FileNotFoundException: No se pudo cargar el archivo o el ensamblado ''System.Data.SqlServerCe, Versión = 3.5.1.0, Culture = neutral, PublicKeyToken = 89845dcd8080cc91'' o una de sus dependencias. El sistema no puede encontrar el archivo especificado.
La desactivación de la casilla de verificación "Resultados de caché" solucionará este problema, al igual que la instalación de SQL Server CE.
El segundo problema es que las infracciones del contrato de código se tratan como connect.microsoft.com/VisualStudio/feedback/details/646880/… . Incluso si tiene habilitado "Tratar las advertencias como errores", su programa continuará compilando y ejecutándose con éxito. Si tiene un proyecto más grande con toneladas de advertencias que ignora, podría ser difícil notar estas nuevas advertencias de contrato de código. En el video de demostración que vi , estas advertencias también se reflejaron en el IDE de Visual Studio (el código de llamada tenía un subrayado azul), sin embargo, parece que no obtengo este comportamiento en Visual Studio 2012.
Esta decisión de diseño me molesta. Si defino un contrato dentro de mi código, que una función debe tomar un número entero mayor que 0, y descarto descaradamente un 0, esto es un error. No es una advertencia. Rompí ese contrato, simple y llanamente.
En general, diría que los contratos de código son extremadamente poderosos y podrían cambiar la forma en que probamos el software. MS Research definitivamente hizo un gran trabajo. Sin embargo, no creo que esté realmente listo para la corriente principal todavía. Se requieren algunos ajustes para comenzar a trabajar, no se integra perfectamente en el proceso de compilación de Visual Studio y también es bastante lento. En proyectos más pequeños, funcionó como se esperaba, pero cuando lo conecté a un proyecto más grande, tomó diez minutos para analizar todo el código.
Estoy leyendo sobre los contratos de código, que a primera vista parecen ser bastante revolucionarios, pero parece que no puedo hacer que funcionen. Estoy ejecutando Windows 8 y Visual Studio 2012 Premium (versiones de lanzamiento de ambos). Luego instalé los Contratos de Código desde here haciendo clic en el enlace Descargar Contratos de Código.
Luego escribí el siguiente código en una nueva aplicación de consola:
class Program
{
static void Main(string[] args)
{
var answer = Add(0, 5);
Console.Write(answer);
Console.ReadLine();
}
static int Add(int x, int y)
{
Contract.Requires(x > 0 && y > 0);
return x + y;
}
}
Espero que la compilación falle, ya que el primer parámetro de Add
es 0, pero el programa tiene éxito e imprime 5 en la consola.
He intentado con la configuración predeterminada del Contrato de Código, y también he eliminado algunas cosas en vano. Mi configuración actual se ve así:
¿Alguna idea de lo que estoy haciendo mal?
ACTUALIZAR:
Aquí están los resultados de la ventana Construir. Parece que está haciendo algo, pero solo genera advertencias en lugar de errores. En el video que vi, estas cosas se marcaron como errores de compilación y el programa ni siquiera se ejecutó.
1>------ Build started: Project: DeleteMe, Configuration: Debug Any CPU ------
1> DeleteMe -> c:/users/mike/documents/visual studio 2012/Projects/DeleteMe/DeleteMe/bin/Debug/DeleteMe.exe
1> CodeContracts: Task manager is unavailable.
1> CodeContracts: DeleteMe: Run static contract analysis.
1> CodeContracts: Suggested requires: Contract.Requires(false);
1> CodeContracts: DeleteMe: Validated: 0.0 %
1> CodeContracts: DeleteMe: Contract density: 0.87
1> CodeContracts: DeleteMe: Total methods analyzed 4
1> CodeContracts: DeleteMe: Methods with 0 warnings 3
1> CodeContracts: DeleteMe: Total time 4.974sec. 1243ms/method
1> CodeContracts: DeleteMe: Methods with necessary preconditions: 1
1> CodeContracts: DeleteMe: Discovered 1 new candidate preconditions in 00:00:00.1718843
1> CodeContracts: DeleteMe: Retained 1 preconditions after filtering
1> CodeContracts: DeleteMe: Inferred 0 object invariants
1> CodeContracts: DeleteMe: Retained 0 object invariants after filtering
1> CodeContracts: DeleteMe: Detected 0 code fixes
1> CodeContracts: DeleteMe: Proof obligations with a code fix: 0
1>c:/Users/Mike/Documents/Visual Studio 2012/Projects/DeleteMe/DeleteMe/Program.cs(14,10,14,33): warning : CodeContracts: requires is false: x > 0 && y > 0
1>c:/Users/Mike/Documents/Visual Studio 2012/Projects/DeleteMe/DeleteMe/Program.cs(22,10,22,44): warning : CodeContracts: location related to previous warning
1> CodeContracts: Checked 1 assertion: 1 false
1> CodeContracts: DeleteMe:
1> CodeContracts: DeleteMe: Static contract analysis done.
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Señor, tendrá que habilitar la verificación de tiempo de ejecución. Debajo de tu en la ventana publicaste como una imagen.
"Completo" significará que todas las condiciones serán revisadas. El resto son autoexplicativos.
- La comprobación estática solo se ejecuta en segundo plano y comprueba si hay algo que pueda mejorar dentro de su código. Precaución - ralentiza un poco las acumulaciones.