Question

Les contrats de code fonctionnent correctement dans Visual Studio 2010, mais je ne parviens pas à ce que ccrewrite.exe fasse quoi que ce soit d’utile à partir de la ligne de commande. Voici un exemple d'application:

using System.Diagnostics.Contracts;

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

Je compile ensuite le code et lance ccrewrite.exe dessus:

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

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

Il n'y a pas de fichier RewrittenDummy.exe par la suite.

J'ai essayé beaucoup d'options, mais rien ne change rien. Quelques choses que j'ai remarquées:

  • Le chargement de Dummy.exe est en cours, car si je spécifie un fichier inexistant, il meurt
  • Dummy.exe contient définitivement des références à Contract - si je l'exécute sans arguments, il échoue correctement (mais le message d'erreur n'a pas été rempli comme je l'aurais cru s'il avait été réécrit)
  • L'utilisation de postconditions et d'invariants ne fait aucune différence

J'ai essayé d'activer les avertissements et la verbosité, et cela n'aide en rien. Qu'est-ce que je fais mal?

(a également demandé en tant que question sur le forum Code Contracts . J'ajouterai toute réponse pertinente ici moi-même.)

Était-ce utile?

La solution

D'accord, cela a été répondu sur le forum MSDN . Pour une fois, ce n’est pas vraiment moi qui suis complètement stupide - c’est quelque chose qui pourrait vraiment faire avec un avertissement.

Lisez le message du forum pour plus de détails, mais le problème de base est que ccrewrite n'a pas pu trouver les classes de contrat: il cherchait dans la version .NET 3.5 CLR de mscorlib au lieu de celui de .NET 4.0.

Ceci peut être corrigé en listant explicitement le chemin d'accès à l'assembly approprié:

> ccrewrite /o:rewrittendummy.exe dummy.exe 
  /libpaths:%SystemRoot%\Microsoft.Net\Framework\v4.0.20506
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top