0

コード コントラクトを使用しようとしていますが、ブロックされている問題が発生しています。コントラクト参照アセンブリをビルドに設定すると、直接参照されるアセンブリによって間接的に参照されるアセンブリにアクセスしようとすると、ccrewrite がエラーになります。これらの間接アセンブリはソリューションの構築には必要ありませんが、なぜコード コントラクトで必要なのか疑問に思っています。また、ビルドの一部としてすべてのランタイム依存関係を提供することなく、この問題を回避する方法はありますか?

4

2 に答える 2

0

リライターは、コントラクトを抽出するために、参照されているアセンブリのメソッド本体を調べます (C# コンパイラは決してそれを行いません)。その結果、リライターは C# よりも多くの依存関係を追跡することが多く、これがあなたが遭遇した問題です。

これに対処するには 2 つの方法があります。

  1. 目的のライブラリが見つかるディレクトリへのパスを追加します (コントラクト ライブラリ パス オプションで)。これが好ましい方法です
  2. -ignoreMetadataErrors最後の手段として、オプションをランタイム コントラクト オプションに追加できます。危険ですのでご注意ください。リライタが適切な IL を作成するために、参照されたコードの一部の側面を本当に必要とする場合、不適切な IL になる可能性があります。これを防ぐには、結果のビットに対して peverify を使用します。

お役に立てれば。

于 2013-04-25T19:10:47.260 に答える
0

ccrewrite は、依存関係チェーンをたどって事前/事後条件などを分析しようとしていると思います。アセンブリが、順番に参照するアセンブリによって参照されている場合、それらプログラムを実行するために必要になるため、ccrewrite は実行されているだけです。プログラムを実際に実行する前に、通常の分析を行います。

これは JML の使用に基づいています。私自身、.NET Code Contracts を調べ始めたばかりです。しかし、どちらのツールもほぼ同じ原理で動作すると私は信じています。

于 2011-07-07T20:35:38.600 に答える