27

Visual Studio 2010内からコードコントラクトが正常に機能ccrewrite.exeしていますが、コマンドラインからは何もできません。サンプルアプリは次のとおりです。

using System.Diagnostics.Contracts;

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

次に、コードをコンパイルして、ccrewrite.exeを実行します。

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

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

RewrittenDummy.exeその後、ファイルはありません。

たくさんのオプションを試しましたが、何も違いはありません。私が気づいたいくつかのこと:

  • 存在しないファイルを指定すると死ぬので、間違いなくDummy.exeを読み込んでいます
  • Dummy.exeには、Contractへの参照が確実に含まれています。引数なしで実行すると、適切に失敗します(ただし、書き直された場合に期待するように、エラーメッセージが入力されていません)。
  • 事後条件と不変条件を使用しても違いはありません

警告と冗長性を上げてみましたが、まったく役に立ちません。何が間違っているのでしょうか。

Code Contractsフォーラムでも質問されています。関連する回答はここに自分で追加します。)

4

1 に答える 1

19

わかりました、これはMSDN フォーラム で回答されています。一度だけ、それは本当に私が完全に愚かだったということではありません - それは本当に警告でできることです.

詳細についてはフォーラムの投稿を参照してください。ただし、基本的な問題はccrewrite、コントラクト クラスが見つからないことですmscorlib。.NET 4.0 ではなく、.NET 3.5 CLR バージョンを探していました。

これは、関連するアセンブリへのパスを明示的にリストすることで修正できます。

> ccrewrite /o:rewrittendummy.exe dummy.exe 
  /libpaths:%SystemRoot%\Microsoft.Net\Framework\v4.0.20506
于 2009-07-31T06:26:54.600 に答える