我正在尝试使用代码合同,而我遇到了一个阻碍我的问题。将Contract Reference Assembly设置为Build时,ccrewrite在尝试访问由直接引用的程序集间接引用的程序集时出错。构建解决方案不需要这些间接组件,所以我想知道为什么代码合同需要它们?此外,有没有办法解决这个问题,而不必提供所有运行时依赖项作为构建的一部分?
答案 0 :(得分:0)
我假设ccrewrite试图遍历依赖链以分析它的前/后条件等。如果程序集引用程序集引用,那么它们将 你的程序要运行,所以ccrewrite只是在你实际运行程序之前执行正常的分析。
这是基于使用JML;我自己刚刚开始查看.NET代码合同。但我相信这两种工具的工作原理基本相同。
答案 1 :(得分:0)
重写器查看引用程序集的方法体以提取契约(C#编译器从不这样做)。因此,重写器经常追逐比C#更多的依赖关系,这是您遇到的问题。
有两种方法可以解决这个问题。
-ignoreMetadataErrors
添加到运行时合同选项中。请注意,这很危险。如果重写器确实需要引用代码的某些方面以创建适当的IL,则最终可能会出现错误的IL。为了防止这种情况,请在结果位上使用peverify。希望这有帮助。