Какие инструменты выполняют модификацию IL после компиляции? - PullRequest
5 голосов
/ 16 июля 2009

Недавнее упоминание о PostSharp напомнило мне об этом:

В прошлом году, когда я работал, мы думали об использовании PostSharp для внедрения инструментов в наш код. Это было в среде Team Foundation Server Team Build / Continuous Integration.

Думая об этом, у меня появилось мучительное чувство о том, как работает PostSharp - он редактирует IL, генерируемый компиляторами. Это немного беспокоило меня.

Меня не очень волновало, что PostSharp не будет правильно выполнять свою работу; Я был обеспокоен тем фактом, что впервые вспомнил, что слышал о таком инструменте. Я был обеспокоен тем, что другие инструменты могут не принять это во внимание.

Действительно, когда мы шли дальше, у нас действительно возникли проблемы, связанные с тем, что PostSharp запутался в том, в какой папке находится исходный IL. Это нарушало наши сборки. Похоже, это произошло из-за конфликта с целью MSBUILD, которая разрешает ссылки на проекты. Похоже, конфликт возник из-за того, что PostSharp использует временный каталог для хранения неизмененных версий IL.

Во всяком случае, у меня не было StackOverflow, на которое можно было ссылаться тогда! Теперь, когда я это сделаю, я хотел бы спросить всех вас, знаете ли вы какие-либо другие инструменты, которые редактируют IL как часть процесса сборки; или Microsoft принимает во внимание такие инструменты в Visual Studio, MSBUILD, Team Build и т. д.


Обновление: Спасибо за ответы.

Суть в том, что, по крайней мере с VS 2010, Microsoft действительно должна знать, что такого рода вещи могут произойти. Поэтому, если в VS2010 есть проблемы в этой области, Microsoft может разделить вину.

Ответы [ 4 ]

4 голосов
/ 16 июля 2009

.NET 4.0 включает в себя код контрактов проекта Microsoft Research, который выполняет утверждения во время выполнения (и некоторые во время компиляции) условий до и после ваших методов. Утверждения реализованы в библиотеке, и компилятор .NET выдает условия pre / post как вызовы методов в IL. Однако, поскольку контракты обычно указываются в начале метода, вторичному инструменту необходимо переписать IL, чтобы расположить утверждения в правильном порядке и в правильных местоположениях.

EDIT:

  • cccheck - это инструмент, который запускает пост-сборку и является статической проверкой, которая проверяет контракты во время компиляции
  • ccrewrite - это инструмент, который запускает post cccheck, переписывает IL и генерирует проверку времени выполнения из контрактов

(я не могу найти дополнительную техническую информацию об этих инструментах)

Я еще не использовал Visual Studio 2010, но я видел демонстрационную версию функции контрактов кода, и она интегрирована в процесс сборки IDE. cccheck должен всегда запускаться, возвращая код, если в собранной сборке присутствуют контракты. Если они присутствуют, код будет означать, что ccrewrite должен работать.

4 голосов
/ 16 июля 2009

Я знаю о Mono.Cecil , библиотеке фреймворков, расширяющей набор инструментов System.Reflection, она используется проектом Lin Fu .

Я не уверен насчет поддержки процесса сборки, вы должны проверить их размер.

3 голосов
/ 16 июля 2009

Я знаю, что Dotfuscator, кодовый обфускатор, изменяет IL сборок сборок, и он используется во многих процессах сборки.

IL модифицируется не только для обфускации и защиты кода, но и для добавления дополнительных функций в ваши приложения (см. Наши (PreEmptive) сообщения в блоге по Runtime Intelligence здесь .

Кроме того, Microsoft Common Compiler Infrastructure имеет возможность считывать сборки, изменять их и переписывать их. См. CodePlex для проекта.

1 голос
/ 11 августа 2015

Fody - расширяемый инструмент для плетения сборок .net на основе архитектуры плагинов.

...