使用代码契约,为什么ccrewrite需要访问每个运行时依赖项?

时间:2011-07-07 17:31:22

标签: c# .net dependencies code-contracts ccrewrite

我正在尝试使用代码合同,而我遇到了一个阻碍我的问题。将Contract Reference Assembly设置为Build时,ccrewrite在尝试访问由直接引用的程序集间接引用的程序集时出错。构建解决方案不需要这些间接组件,所以我想知道为什么代码合同需要它们?此外,有没有办法解决这个问题,而不必提供所有运行时依赖项作为构建的一部分?

2 个答案:

答案 0 :(得分:0)

我假设ccrewrite试图遍历依赖链以分析它的前/后条件等。如果程序集引用程序集引用,那么它们 你的程序要运行,所以ccrewrite只是在你实际运行程序之前执行正常的分析。

这是基于使用JML;我自己刚刚开始查看.NET代码合同。但我相信这两种工具的工作原理基本相同。

答案 1 :(得分:0)

重写器查看引用程序集的方法体以提取契约(C#编译器从不这样做)。因此,重写器经常追逐比C#更多的依赖关系,这是您遇到的问题。

有两种方法可以解决这个问题。

  1. 向可以找到所需库的目录添加额外路径(在合同库路径选项中)。这是首选方法
  2. 作为最后的手段,您可以将选项-ignoreMetadataErrors添加到运行时合同选项中。请注意,这很危险。如果重写器确实需要引用代码的某些方面以创建适当的IL,则最终可能会出现错误的IL。为了防止这种情况,请在结果位上使用peverify。
  3. 希望这有帮助。