Почему сборки с атрибутом SecurityTransparent заставляют инструментальный код через профилировщик генерировать исключение VerificationException?
Кажется, что когда я применяю инструмент для сборки, использующей OpenCover, сборки с атрибутом SecurityTransparent (и, кажется, AllowPartiallyTrustedCallers) выдают исключение VerificationException. Я хотел бы знать, почему это так и есть ли альтернативное решение для перекомпиляции сборки без включенных атрибутов, то есть условной компиляции, как видно из загруженного кода для MVC3 (но, как ни странно, я не могу найти то же самое, когда просматриваю хранилище в кодекплексе). Обратите внимание, что без этих атрибутов сборки покрытие выполняется без проблем.
OpenCover использует инструкцию CALLI для отправки данных инструментария (идентификатора точки последовательности) в профилировщик. Кажется, что вызов этой инструкции вызывает исключение; инструментальная часть выглядит нормально, и JIT без проблем компилирует новый инструментальный метод. Акт инструментария не вызывает проблем, потому что, если я удаляю все инструментарий, кроме как делать методы Tiny Fat и маленькие ветки длиной, код выполняется без проблем.
В настоящее время я использую Mono.Cecil, чтобы исследовать сборки, которые проходят фильтр "включить в покрытие", и сообщать о проблеме пользователю, пропуская инструментарий, а затем продолжить, но я хотел бы знать, есть ли что-нибудь, что я могу сделать во время профилирования, чтобы избежать этой проблемы и избежать перекомпиляции.
Итак, чтобы подвести итог 2 вопроса "Почему это происходит?" и "Могу ли я избежать этого без перекомпиляции?"
ПРИМЕЧАНИЕ: PartCover также, кажется, обнаруживает эту проблему, и он использует другой метод для записи точек посещения.
ПРИМЕЧАНИЕ. Я являюсь разработчиком OpenCover (инструмента покрытия с открытым исходным кодом) и в настоящее время поддерживаю PartCover.
1 ответ
Я разместил ответ на форумах MSDN. Почему сборки с атрибутом SecurityTransparent заставляют инструментальный код через профилировщик генерировать исключение VerificationException?
и получил ответ, что я должен посмотреть на флаг COR_PRF_DISABLE_TRANSPARENCY_CHECKS_UNDER_FULL_TRUST (только.NET4 кажется)
смотрите также:
http://www.madgnome.fr/2011/09/verificationexception-and-profiling-the-hidden-flag/
http://blogs.msdn.com/b/davbr/archive/2010/01/07/clr-v4-stuff-that-may-break-your-profiler.aspx