当我使用OpenCover检测程序集时,具有SecurityTransparent属性的程序集(看起来似乎是AllowPartiallyTrustedCallers)将抛出VerificationException。我想知道为什么会这样,如果有一个替代解决方案重新编译程序集没有包括那些属性,即条件编译,如下载的MVC3代码中所见(但奇怪的是,当我浏览时,我找不到相同的codeplex上的存储库)。请注意,如果没有这些程序集属性,则运行时不会出现问题。
OpenCover使用CALLI instruction将检测数据(序列点标识符)发送到探查器。似乎调用此指令的行为会导致异常发生;仪表部分似乎很好,JIT编译新的仪表方法没有问题。检测行为不会导致问题,因为如果我删除除了使用Tiny方法之外的所有检测方法,那么代码执行时会有很长的代码执行。
目前我正在使用Mono.Cecil检查通过“include-in-coverage”过滤器的程序集,并在跳过仪器时向用户报告问题然后继续,但我想知道是否有任何内容我可以在分析期间做以避免此问题并避免重新编译。
总结2个问题“为什么会发生?”并且“如果没有重新编译,我可以避免它吗?”
注意:PartCover似乎也出现了这个问题,它使用不同的方法来记录访问点。
注意:我是OpenCover(一个开源代码覆盖工具)的开发人员,目前是PartCover的维护者。
答案 0 :(得分:2)
我在MSDN论坛上发布了答案 - Why do assemblies with the SecurityTransparent attribute cause instrumented code via a profiler to throw a VerificationException?
并得到一个答案,我应该看一下COR_PRF_DISABLE_TRANSPARENCY_CHECKS_UNDER_FULL_TRUST标志(仅在.NET4看来)
另见:
http://www.madgnome.fr/2011/09/verificationexception-and-profiling-the-hidden-flag/