#.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. Ссылка восстановлена. Я добавил некоторую информацию о том, как его открыть.