¿Por qué ccrewrite.exe no hace nada desde la línea de comandos?
-
05-07-2019 - |
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.)
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