2010-11-27 4 views
4

Bonjour J'ai un petit problème concernant CodeContracts. J'ai un projet de bibliothèque de classes qui en tant que classe avec une méthode foo (chaîne s1, chaîne s2); à l'intérieur de la méthode foo, j'ai un Contract.Requires (s1! = Null). Donc si je comprends la signification de mon code (oui, je viens d'installer CodeContracts et de jouer avec :), le contrat va vérifier l'expression s1! = Null pendant le processus de construction et en runtime, en levant ArgumentException>. Je voulais tester le comportement, quand j'appelle foo (null, "test") du projet lib de classe, le concepteur me parle du problème, mais quand je l'appelle depuis le projet de l'application winform, je ne reçois aucun avertissement dans la fenêtre de la liste d'erreurs. Cela signifie-t-il que les contrats de code ne fonctionnent que dans le projet qu'ils résident et non à l'extérieur? MerciCodeContracts problème

MISE À JOUR


J'ai oublié de mentionner que les conditions que j'ai ajouté ne fonctionne pas dans l'analyse statique. Cependant, ils lancent ArgumentException avec un message approprié en cours d'exécution.

Répondre

6

Ok les gars, grâce à l'équipe MS, j'ai trouvé le problème. La raison d'un tel comportement étrange était que le nom de mon assemblée se terminait par ".Contracts.dll". Et le problème est que l'analyseur statique ne vérifie pas les assemblages dont les noms se terminent par cela. J'ai rebaptisé l'ensemble et tout fonctionne comme un charme, comme tout autre produit MS :)

+2

Absolute Life Saver, me rendait fou! –

+0

Je suis heureux d'avoir pu aider :) – Davita

+1

Merci! Ils doivent au moins ajouter un avertissement ou quelque chose si c'est le cas. Presque 5 ans après cette question, ce problème m'a coûté * heures * ... C'est le seul endroit sur internet que j'ai trouvé ce comportement documenté. – Sabre

2

Cela devrait fonctionner si vous avez Perform Static Contract Checking vérifié dans votre projet WinForms. Vérifiez également que Perform Runtime Contract Checking est vérifié dans votre projet de bibliothèque de classes si vous souhaitez vérifier l'exécution.

De même, dans votre projet de bibliothèque de classes, Contract Reference Assembly doit être défini sur Build.

Du Code documentation des contrats:

Si votre projet contient des contrats et est référencé par d'autres projets, nous vous recommandons fortement que vous sélectionnez Construire dans la section de référence du contrat de assemby dans l'onglet Propriétés pour CodeContracts.

Cet ensemble de référence de contrat est crucial pour rendre les contrats de votre projet disponibles pour les projets de référencement. Sans construire un ensemble de référence de contrat, d'autres projets ne peuvent pas déterminer quels contrats sont présents.

+0

Merci pour la réponse andrift. Eh bien j'ai. J'ai vérifié les deux dans les deux projets, mais cela ne fonctionne pas. La fenêtre des messages indique: CodeContracts: vérifié 0 assertions. une idée? – Davita

+0

Dans votre projet de bibliothèque de classes, avez-vous défini 'Contract Reference Assembly' sur' Build'? –

+0

Oui, c'est Construit dans le projet lib de la classe. dans le projet Winform, il est mis à zéro – Davita

0

Vous n'avez pas écrit quelle version de Visual Studio vous utilisez. Le code AFAIK Cotnract Static Analysis fonctionne uniquement avec VS Premium (c'est-à-dire que Standard et Professional ne suffisent pas).