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 安装 SQL Server CE 才能使代码契约正常工作。哦,我的构建并没有构建代码契约引用程序集,它只是尝试进行静态检查并进行重写以完成运行时检查。

最后,我确实尝试从 AppHarbor.sln 禁用代码契约,但该设置是项目设置而不是解决方案设置,因此它也会为我的常规解决方案文件禁用它们。

4

3 回答 3

4

弄清楚了。.NET 代码契约(System.Diagnostics.Contracts 命名空间,对于那些不知道的人)有一个功能,可以根据已放入代码中的契约对代码进行静态分析。如果您安装了用于代码合同的 Visual Studio 附加组件,您可以转到 VS 项目的属性页并单击代码合同选项卡。在静态检查部分有一个称为缓存结果的选项。如果启用此功能,则静态检查在构建时使用 SQL Server 嵌入式数据库,以使其对其静态代码分析所做的一切运行得更快(显然,此文件将在编译之间保留在您的项目目录中)。这是构建服务器对 SQL CE 的依赖,它与应用程序的运行时环境无关。

由于 AppHarbor 在其构建服务器上没有 SQL CE,我所做的是更改我的每个项目的代码合同属性,以执行运行时合同检查并为调试和发布构建执行静态合同检查,但对于发布构建执行静态合同检查部分中的缓存结果选项被禁用。(另请注意,由于 AppHarbor 不允许后台任务从 Visual Studio 运行,因此还必须禁用“执行静态合同检查”部分的“后台检查”选项。)

为什么看起来我是唯一一个使用 System.Diagnostics.Contracts 命名空间(除了 .NET Framework 本身)的人?

于 2012-10-27T14:44:49.727 回答
0

我对代码合同不是很熟悉,但问题可能只是您缺少 SQL Server CE。您可能想尝试一个不使用 SQL Server CE 的项目来进行检查。考虑使用 NuGet 或作为可部署 bin 的程序集添加 SQL Server CE,以确保它在 AppHarbor 运行您的构建时可用。此博客文章中有更多信息。

于 2012-10-26T19:30:50.500 回答
0

尽管 Code Contracts 生成的每条错误消息都表明您需要安装 SQL Server CE 3.5.1,但您确实必须安装3.5.2版本。

卸载所有其他 3.5.x 版本的 SQL Server CE 并安装它,对我有用。是的,如果您在 64 位机器上,您确实需要 32 位和 64 位版本。

于 2012-11-05T00:57:30.337 回答