Какие инструменты выполняют модификацию 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 на основе архитектуры плагинов.

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