4

最初のAppHarborでホストされているアプリをデプロイしようとしていますが、ビルドで問題が発生しました。コードコントラクトがアセンブリを書き直そうとするまで、すべてが正常に構築されます。ログのエラーは次のとおりです。

CodeContractsRunCodeAnalysisInternal:
     CodeContracts: Task manager is unavailable (unable to run in background).
     CodeContracts: ABC: Run static contract analysis.
     CodeContracts: ABC: Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Data.SqlServerCe, Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.SQLCacheDataAccessor.GetMetadataOrNull(String key, Boolean silent)
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.CacheManager`11.TestCache()
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.CacheManager`11..ctor(Dictionary`2 methodAnalyses, Dictionary`2 classAnalyses, GeneralOptions options)
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.CacheManager`11.Create(Dictionary`2 dictionary, Dictionary`2 dictionary_2, GeneralOptions generalOptions)
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.Clousot.TypeBinder`9..ctor(String[] args, IDecodeMetaData`9 mdDecoder, IDecodeContracts`5 contractDecoder, IDictionary assemblyCache, Action`3 setTargetPlatform, IOutputFullResultsFactory`2 externalOutputFactory)
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.Clousot.ClousotMain[Local,Parameter,Method,Field,Property,Event,Type,Attribute,Assembly](String[] args, IDecodeMetaData`9 mdDecoder, IDecodeContracts`5 contractDecoder, IDictionary assemblyCache, Action`3 setTargetPlatform)
     CodeContracts: ABC:    at Microsoft.Research.CodeAnalysis.CCI1Driver.Main(String[] args)
     CodeContracts: ABC: 
     CodeContracts: ABC: Static contract analysis done.

Visual Studioを使用してローカルでビルドする場合、コードコントラクトはバックグラウンドスレッドで実行されることを知っています。たぶん、AppHarborはこれを行うためにそのようなスレッドを作成することを許可していませんか?しかし、System.Data.SqlServerCe.dllが見つからないというこのエラーは何ですか?私のコードは確かにそれを使用していませんが、おそらくMSコードコントラクトは使用していますか?

誰かがコードコントラクトを含むコードをAppHarborに正常にデプロイしたかどうか疑問に思っていますか?もしそうなら、それを機能させるために何をしましたか?コードコントラクトを機能させるには、AppHarborによってSQLServerCEをインストールする必要がある場合があります。ああ、私のビルドはコードコントラクトリファレンスアセンブリをビルドしません。静的チェックを実行し、実行時チェックを実行するために書き換えを実行しようとします。

最後に、AppHarbor.slnからコードコントラクトを無効にしようとしましたが、その設定はプロジェクト設定であり、ソリューション設定ではないため、通常のソリューションファイルでも無効になります。

4

3 に答える 3

4

理解した。.NET コード コントラクト (知らない人のために説明すると、System.Diagnostics.Contracts 名前空間) には、コードに組み込まれたコントラクトに基づいてコードの静的分析を実行できる機能があります。コード コントラクト用の Visual Studio アドオンがインストールされている場合は、VS プロジェクトのプロパティ ページに移動し、[コード コントラクト] タブをクリックできます。Static Checking セクションには、Cache Results というオプションがあります。これを有効にすると、静的チェックはビルド時に SQL Server 組み込みデータベースを使用して、静的コード分析の実行を高速化します (明らかに、このファイルはコンパイル間でプロジェクト ディレクトリに保持されます)。これは、ビルド サーバーが SQL CE に対して持つ依存関係であり、アプリのランタイム環境とは関係ありません。

AppHarbor のビルド サーバーには SQL CE がないため、各プロジェクトのコード コントラクト プロパティを変更して、デバッグ ビルドとリリース ビルドの両方でランタイム コントラクト チェックを実行し、静的コントラクト チェックを実行します。 [静的コントラクト チェックの実行] セクションの [結果のキャッシュ] オプションは無効になっています。(また、AppHarbor では Visual Studio からバックグラウンド タスクを実行できないため、[静的コントラクト チェックの実行] セクションの [バックグラウンドでチェック] オプションも無効にする必要があることに注意してください。)

System.Diagnostics.Contracts 名前空間 (.NET Framework 自体以外) を使用しているのは私だけのように見えるのはなぜですか?

于 2012-10-27T14:44:49.727 に答える
0

Code Contracts が生成するすべてのエラー メッセージは、SQL Server CE 3.5.1 をインストールする必要があることを示唆していますが、実際にはバージョン3.5.2をインストールする必要があります。

SQL Server CE の他のすべての 3.5.x バージョンをアンインストールし、これをインストールすると、問題が解決しました。はい、64 ビット マシンを使用している場合は、32 ビット バージョンと 64 ビット バージョンの両方が必要です。

于 2012-11-05T00:57:30.337 に答える
0

私はコード コントラクトについてあまり詳しくありませんが、単に SQL Server CE が見つからないことが問題なのかもしれません。確認のためだけに、SQL Server CE を使用していないプロジェクトを試してみることをお勧めします。AppHarbor がビルドを実行するときに確実に使用できるように、NuGet を使用して、またはバイナリ展開可能なアセンブリとして SQL Server CE を追加することを検討してください。詳細については、このブログ投稿を参照してください。

于 2012-10-26T19:30:50.500 に答える