Pregunta

Tengo Code Contracts funcionando bien desde Visual Studio 2010, pero no puedo hacer que ccrewrite.exe haga nada útil desde la línea de comandos. Aquí hay una aplicación de muestra:

using System.Diagnostics.Contracts;

public class Dummy
{
    public static void Main(string[] args)
    {
        Contract.Requires(args.Length > 0);
    }
}

Luego compilo el código y ejecuto ccrewrite.exe en él:

> csc /debug+ /D:CONTRACTS_FULL Dummy.cs

> ccrewrite /o:RewrittenDummy.exe Dummy.exe
elapsed time: 61ms

No hay ningún archivo RewrittenDummy.exe después.

He probado muchas opciones, pero nada hace ninguna diferencia. Algunas cosas que he notado:

  • Definitivamente está cargando Dummy.exe, porque si especifico un archivo inexistente, muere
  • Dummy.exe definitivamente contiene referencias al Contrato; si lo ejecuto sin argumentos, falla correctamente (pero el mensaje de error no se ha completado como cabría esperar si se hubiera reescrito)
  • El uso de condiciones posteriores e invariantes no hace ninguna diferencia

He intentado aumentar las advertencias y la verbosidad, y eso no ayuda en absoluto ¿Qué estoy haciendo mal?

(También se pregunta como pregunta en el foro de Contratos de Código . Agregaré todas las respuestas relevantes aquí mismo.)

¿Fue útil?

Solución

Bien, esto ha sido respondido en el foro de MSDN . Por una vez, en realidad no fui yo completamente estúpido, es algo que realmente podría hacer con una advertencia.

Lea la publicación del foro para obtener detalles completos, pero el problema básico es que ccrewrite no pudo encontrar las clases de contrato: estaba buscando en la versión .NET 3.5 CLR de mscorlib en lugar del .NET 4.0.

Esto se puede solucionar enumerando explícitamente la ruta al ensamblado relevante:

> ccrewrite /o:rewrittendummy.exe dummy.exe 
  /libpaths:%SystemRoot%\Microsoft.Net\Framework\v4.0.20506
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top