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

本文关键字:访问 运行时 依赖 代码 契约 ccrewrite 为什么 | 更新日期: 2023-09-27 18:01:24

我正在尝试使用代码合同,我遇到了一个问题,这是阻止我。将契约引用程序集设置为"生成"时,crewrite在试图访问由直接引用的程序集间接引用的程序集时出错。这些间接程序集不需要构建解决方案,所以我想知道为什么代码契约需要它们?此外,是否有一种方法可以解决这个问题,而不必提供所有运行时依赖关系作为构建的一部分?

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

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

这是基于使用JML;我自己才刚刚开始研究。net代码契约。但我相信这两种工具的运作原理大致相同。

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

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

  1. 为可以找到所需库的目录添加额外的路径(在合约库路径选项中)。这是首选方法
  2. 作为最后的手段,您可以将-ignoreMetadataErrors选项添加到运行时合同选项中。注意,这是危险的。如果重写者确实需要引用代码的某些方面来创建正确的IL,则可能最终得到不正确的IL。为了防止这种情况,请对生成的位使用peverify。