Какие инструменты выполняют модификацию IL после компиляции?
Недавнее упоминание о PostSharp напомнило мне об этом:
В прошлом году, когда я работал, мы думали об использовании PostSharp для внедрения инструментов в наш код. Это было в среде Team Foundation Server Team Build / Continuous Integration.
Размышляя об этом, у меня появилось неприятное чувство о том, как работает PostSharp - он редактирует IL, генерируемый компиляторами. Это немного беспокоило меня.
Меня не очень волновало, что PostSharp не справится со своей задачей; Я был обеспокоен тем фактом, что впервые вспомнил, что слышал о таком инструменте. Я был обеспокоен тем, что другие инструменты могут не принять это во внимание.
Действительно, когда мы продвигались, у нас действительно были некоторые проблемы, связанные с тем, что PostSharp запутался в том, в какой папке находится исходный IL. Это нарушало наши сборки. Похоже, это произошло из-за конфликта с целью MSBUILD, которая разрешает ссылки на проекты. Похоже, конфликт возник из-за того, что PostSharp использует временный каталог для хранения неизмененных версий IL.
Во всяком случае, у меня не было Stackru, чтобы ссылаться тогда! Теперь, когда я это сделаю, я хотел бы спросить вас всех, знаете ли вы какие-либо другие инструменты, которые редактируют IL как часть процесса сборки; или Microsoft принимает во внимание такие инструменты в Visual Studio, MSBUILD, Team Build и т. д.
Обновление: спасибо за ответы.
Суть в том, что, по крайней мере с VS 2010, Microsoft действительно должна знать, что такого рода вещи могут произойти. Так что если в VS2010 есть проблемы в этой области, то Microsoft может разделить вину.
4 ответа
Я знаю, что Dotfuscator, обфускатор кода, модифицирует IL сборок сборок, и он используется во многих процессах сборки.
IL модифицируется не только для обфускации и защиты кода, но и для добавления дополнительных функций в ваши приложения (см. Наши (PreEmptive) сообщения в блоге по Runtime Intelligence здесь.
Кроме того, Microsoft Common Compiler Infrastructure имеет возможность считывать сборки, изменять их и переписывать их. Смотрите CodePlex для проекта.
.NET 4.0 включает в себя проект контрактов кода от Microsoft Research, который выполняет во время выполнения (и некоторые во время компиляции) утверждения до / после условий ваших методов. Утверждения реализованы в библиотеке, и компилятор.NET выдает условия pre/post как вызовы методов в IL. Однако, поскольку контракты обычно указываются в начале метода, вторичному инструменту необходимо переписать IL, чтобы расположить утверждения в правильном порядке и в правильных местоположениях.
РЕДАКТИРОВАТЬ:
- cccheck - это инструмент, который запускает пост-сборку и является статической проверкой, которая проверяет контракты во время компиляции
- ccrewrite - это инструмент, который запускает post cccheck, переписывает IL и генерирует проверку времени выполнения из контрактов.
(Я не могу найти дополнительную техническую информацию об этих инструментах)
Я еще не использовал Visual Studio 2010, но я видел демонстрацию функции Code Contracts, и она интегрирована в процесс сборки IDE. cccheck всегда должен запускаться, возвращая код, если в собранной сборке присутствуют контракты. Если они присутствуют, код будет означать, что ccrewrite должен работать.
Я знаю о Mono.Cecil, библиотеке фреймворков, расширяющей набор инструментов System.Reflection, она используется проектом Lin Fu.
Я не уверен в поддержке процесса сборки, вы должны проверить их размер.
Fody - расширяемый инструмент для плетения сборок.net на основе архитектуры плагинов.