Почему сборки с атрибутом SecurityTransparent заставляют инструментальный код через профилировщик генерировать исключение VerificationException?

Кажется, что когда я применяю инструмент для сборки, использующей OpenCover, сборки с атрибутом SecurityTransparent (и, кажется, AllowPartiallyTrustedCallers) выдают исключение VerificationException. Я хотел бы знать, почему это так и есть ли альтернативное решение для перекомпиляции сборки без включенных атрибутов, то есть условной компиляции, как видно из загруженного кода для MVC3 (но, как ни странно, я не могу найти то же самое, когда просматриваю хранилище в кодекплексе). Обратите внимание, что без этих атрибутов сборки покрытие выполняется без проблем.

OpenCover использует инструкцию CALLI для отправки данных инструментария (идентификатора точки последовательности) в профилировщик. Кажется, что вызов этой инструкции вызывает исключение; инструментальная часть выглядит нормально, и JIT без проблем компилирует новый инструментальный метод. Акт инструментария не вызывает проблем, потому что, если я удаляю все инструментарий, кроме как делать методы Tiny Fat и маленькие ветки длиной, код выполняется без проблем.

В настоящее время я использую Mono.Cecil, чтобы исследовать сборки, которые проходят фильтр "включить в покрытие", и сообщать о проблеме пользователю, пропуская инструментарий, а затем продолжить, но я хотел бы знать, есть ли что-нибудь, что я могу сделать во время профилирования, чтобы избежать этой проблемы и избежать перекомпиляции.

Итак, чтобы подвести итог 2 вопроса "Почему это происходит?" и "Могу ли я избежать этого без перекомпиляции?"

ПРИМЕЧАНИЕ: PartCover также, кажется, обнаруживает эту проблему, и он использует другой метод для записи точек посещения.

ПРИМЕЧАНИЕ. Я являюсь разработчиком OpenCover (инструмента покрытия с открытым исходным кодом) и в настоящее время поддерживаю PartCover.

1 ответ

Решение
Другие вопросы по тегам