Perché ccrewrite.exe non sta facendo nulla dalla riga di comando?
-
05-07-2019 - |
Domanda
I Contratti di codice funzionano correttamente all'interno di Visual Studio 2010, ma non riesco a ottenere ccrewrite.exe
per eseguire operazioni utili dalla riga di comando. Ecco un'app di esempio:
using System.Diagnostics.Contracts;
public class Dummy
{
public static void Main(string[] args)
{
Contract.Requires(args.Length > 0);
}
}
Compilo quindi il codice ed eseguo ccrewrite.exe su di esso:
> csc /debug+ /D:CONTRACTS_FULL Dummy.cs
> ccrewrite /o:RewrittenDummy.exe Dummy.exe
elapsed time: 61ms
In seguito non è presente alcun file RewrittenDummy.exe
.
Ho provato un sacco di opzioni, ma niente fa alcuna differenza. Alcune cose che ho notato:
- Sta sicuramente caricando Dummy.exe, perché se specifico un file inesistente, muore
- Dummy.exe contiene sicuramente riferimenti al contratto - se lo eseguo senza argomenti, non funziona correttamente (ma il messaggio di errore non è stato compilato come mi aspetterei se fosse stato riscritto)
- L'uso di postcondizioni e invarianti non fa alcuna differenza
Ho provato ad alzare avvertimenti e verbosità, e questo non aiuta affatto Cosa sto sbagliando?
(Richiesto anche come domanda nel forum Contratti di codice . Aggiungerò qui le risposte pertinenti.)
Soluzione
Ok, questo è stato ha risposto nel forum MSDN . Per una volta, non ero proprio io a essere completamente stupido - è qualcosa che potrebbe davvero fare con un avvertimento.
Leggi il post sul forum per tutti i dettagli, ma il problema di base è che ccrewrite
non è riuscito a trovare le classi di contratto: stava cercando nella versione .NET 3.5 CLR di mscorlib anziché .NET 4.0.
Questo può essere risolto elencando esplicitamente il percorso dell'assembly pertinente:
> ccrewrite /o:rewrittendummy.exe dummy.exe
/libpaths:%SystemRoot%\Microsoft.Net\Framework\v4.0.20506