2010-11-27 16 views
4

こんにちは 私はCodeContractsに関して少し問題があります。私はメソッドfoo(文字列s1、文字列s2)を持つクラスとしてクラスライブラリプロジェクトを持っています。 fooメソッドの中には、Contract.Requires(s1!= null)があります。 私のコードの意味を理解していれば(はい、CodeContractsをインストールして遊んでいます:)、契約では、ビルドプロセス中と実行時にArgumentException>をスローしてs1!= null式をチェックします。 私はビヘイビアをクラスのプロジェクトからfoo(null、 "test")を呼び出すとデザイナーが私に教えてくれますが、私はwinformアプリケーションプロジェクトから呼び出すと警告が出ませんエラーリストウィンドウに表示されます。それで、コード契約は彼らが住んでいるプロジェクトでのみ働くのであって、外ではないということですか? おかげCodeContracts issue

UPDATE


は、私が追加した前提条件が静的解析では動作しないことを言及するのを忘れてしまいました。しかし、実行時には適切なメッセージとともにArgumentExceptionをスローします。

答えて

6

皆さん、MSチームのおかげで、問題が見つかりました。このような奇妙な動作の理由は、私の議会の名前が ".Contracts.dll"で終わったということでした。そして、問題は、スタティック・アナライザは、その名前で終わるアセンブリをチェックしないということです。私はアセンブリの名前を変更し、すべての他のMS製品と同様に、魅力のように動作します:)

+2

絶対的な人生の節約は、私を狂ってしまいました! –

+0

喜んで私は助けることができました:) – Davita

+1

ありがとうございます!このような場合は、少なくとも警告や何かを追加する必要があります。この質問の約5年後にこの問題はちょうど私に*時間を要しました* ...これはインターネット上の唯一の場所で、この動作が文書化されています。 – Sabre

2

これは、Perform Static Contract Checkingがwinformsプロジェクトでチェックされている場合に有効です。また、ランタイムチェックが必要な場合は、Perform Runtime Contract Checkingがクラスライブラリプロジェクトでチェックされていることを確認してください。

また、クラスライブラリプロジェクトでは、Contract Reference AssemblyBuildに設定する必要があります。コードコントラクトドキュメントから

プロジェクトは契約が含まれており、他のプロジェクトによって参照されている場合は、私達は強くあなたがCodeContractsのプロパティ]タブで契約参照assembyセクションの下でのビルドを選択することをお勧めします。

この契約参照アセンブリは、プロジェクト内の契約を参照プロジェクトで利用できるようにするために重要です。契約参照アセンブリを構築することなく、他のプロジェクトではどの契約が存在するのかを判断できません。

+0

返信andriftありがとう。まあ私は持っています。私は両方のプロジェクトで両方をチェックしましたが、うまくいきません。 メッセージウィンドウには、 CodeContracts:0アサーションがチェックされています。 – Davita

+0

クラスライブラリプロジェクトで、 'Contract Reference Assembly'を' Build'に設定しましたか? –

+0

はい、クラスlibプロジェクトのビルドに設定されています。 Winformプロジェクトでは、それはnoneに設定されています – Davita

0

使用しているVisual Studioのバージョンは書かれていません。 AFAIKコードCotnract静的解析はVS Premiumのみで動作します(StandardとProfessionalでは不十分です)。