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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top