Что такое плетение ИЛ?

#.net #postsharp

Вопрос:

Я только что видел сегодняшнее сообщение Айенде о ПостШарпе. Я скачал код и опробовал его, и я подумал, что это самый крутой и простой в использовании способ справиться с AOP, который я когда-либо видел.

В своем посте Айенде говорит, что PostSharp выполняет свою магию с помощью плетения IL. Теперь, на каком-то абстрактном уровне я могу понять, что это значит, но я хотел посмотреть, есть ли более подробный ответ. К сожалению, впервые за очень долгое время Google оказался для меня пустым. И поэтому я подумал, что это будет отличный вопрос для StackOverflow (так как я уже пару лет подписываюсь на блог Джеффа и знал, что этот сайт делает свое дело).

Итак, что же такое плетение IL и как оно выполняется?

Ответ №1:

Плетение относится к процессу внедрения функциональности в существующую программу. Это может быть сделано концептуально на нескольких уровнях:

  • Создание исходного кода будет вводить строки исходного кода до компиляции кода
  • IL-ткачество (для .NET) добавляет код в качестве инструкций IL в сборку
  • Переплетение байт-кода (для Java) работает с файлом класса, см. Эти комментарии в аспекте J

Теоретически вы могли бы пойти еще дальше и создать исполняемый файл, скомпилированный в собственные инструкции, но это добавило бы много сложности, и я не знаю ничего, что делает это.

Комментарии:

1. Собственная инструкция «плетение» является обычным явлением в собственных исполняемых отладчиках. Например, в наборе инструкций Intel x86 для установки точки останова в коде требуется вставить код операции INT 3 в целевой код. Это перезаписывает собственную инструкцию, поэтому вам также нужно сохранить байт, который там был, и вернуть его обратно после достижения точки останова, чтобы программа выполнялась нормально. Да, это сложно, вот почему написание отладчиков-это утонченное искусство.

2. некоторые ссылки, которые я собрал по этой теме: плетение исходного кода tara.tcd.ie/handle/2262/1239 ; ИЛ ткачество gutgames.com/post/Creating-an-AOP-Library-in-Net-Part-1.aspx ; Плетение байт-кода eclipse.org/aspectj/doc/released/devguide/… ; Аспект# developerfusion.com/article/5307/…

3. Обратите внимание, что в комментарии, который оставил Йерун, сообщение от gutgames.com на самом деле речь идет о реализации AOP с использованием подклассов, а не IL-плетения.

Ответ №2:

Плетение IL аналогично плетению байт-кода. .Net компилируется на промежуточный язык, которым управляет .ЧИСТАЯ clr. IL Weaving в основном анализирует и изменяет промежуточный язык. Поскольку это делается на этом уровне, это может быть сделано для всех .СЕТЕВЫЕ языки.

Ответ №3:

Может помочь, если вместо этого вы используете инъекцию MSIL в Google. Эта ссылка взята из PostSharp, и она хорошо это объясняет.

Моя компания недавно купила продукт под названием dynaTrace для диагностики производительности. Он использует инъекцию MSIL для определения методов. В основном он добавляет код IL до вашего метода и после того, как метод будет применен (я уверен, что в этом есть гораздо больше).

И вот довольно сложное, но хорошее объяснение этого процесса.

Комментарии:

1. Ваша вторая ссылка («здесь») больше недоступна, вероятно, с тех пор, как соответствующий выпуск был заархивирован. Вы случайно не помните год/месяц выпуска, на который вы ссылались? Заранее спасибо.

2. Ссылка восстановлена. Я добавил некоторую информацию о том, как его открыть.