5

似乎当我使用OpenCover 检测程序集时,具有SecurityTransparent属性的程序集(以及似乎是 AllowPartiallyTrustedCallers)将引发 VerificationException。我想知道为什么会这样,以及是否有另一种解决方案来重新编译不包含这些属性的程序集,即条件编译,如下载的 MVC3 代码中所示(但奇怪的是,当我浏览codeplex 上的存储库)。请注意,如果没有这些程序集属性,则覆盖范围运行没有问题。

OpenCover 使用CALLI 指令将检测数据(序列点标识符)发送到分析器。似乎调用该指令的行为会导致异常发生;检测部分似乎很好,JIT 编译新的检测方法没有问题。插桩的行为不会引起问题,因为如果我删除所有插桩,而不是让 Tiny 方法变胖和小分支长,代码执行没有问题。

目前我正在使用 Mono.Cecil 检查通过“包含在覆盖范围内”过滤器的程序集并向用户报告问题,同时跳过检测然后继续,但我想知道是否有任何我可以在分析期间执行以避免此问题并避免重新编译。

所以总结两个问题“为什么会发生?” 和“我可以在不重新编译的情况下避免它吗?”

注意:PartCover 似乎也出现了这个问题,它使用不同的方法来记录访问点。

注意:我是 OpenCover(一个开源代码覆盖工具)的开发者,目前是 PartCover 的维护者。

4

1 回答 1

2

我在 MSDN 论坛上发布了答案 -为什么具有 SecurityTransparent 属性的程序集会通过探查器导致检测代码抛出 VerificationException?

并得到一个答案,我应该查看 COR_PRF_DISABLE_TRANSPARENCY_CHECKS_UNDER_FULL_TRUST 标志(似乎只有.NET4)

也可以看看:

http://www.madgnome.fr/2011/09/verificationexception-and-profiling-the-hidden-flag/

https://web.archive.org/web/20190114032309/https://blogs.msdn.microsoft.com/davbr/2010/01/07/clr-v4-stuff-that-may-break-your-profiler

于 2011-09-02T13:08:49.957 回答