АОП зависит от двух вещей:
- Возможность добавить дополнительный код в существующую единицу кода
- Механизм для размещения условий, где код должен быть введен.
Обычно это называется переплетением кода. Это специализация в более широком исследовании трансформации программ.
JIT-скомпилированные языки имеют больше возможностей для реализации переплетения кода, чем статически скомпилированные программы, потому что в байт-коде / IL сохраняется больше информации. Они также поддерживают рефлексию, которая дает возможность манипулировать кодом во время выполнения.
Delphi.NET и Prism имеют такой же доступ к этим возможностям, как и любой другой язык .NET.
Есть две AOP-инфраструктуры для Delphi Win32, о которых я знаю. Первый - MeAOP , который уже упоминался. Второй Инфра . Оба проекта используют схожий подход к АОП. Они используют комбинацию RTTI и умных манипуляций с указателями для перехвата вызовов методов, чтобы вы могли выполнить дополнительный код до или после вызова метода. Вы определяете свою сквозную функцию как подкласс класса AOP фреймворка. Вы регистрируете методы, которые хотите перехватить, передавая имя метода в качестве строкового аргумента в инфраструктуру AOP.
Обе платформы по-прежнему активно развиваются и на самом деле имеют больший охват, чем просто АОП. К сожалению, документация несколько скудна (и в случае с Infra, в основном, на португальском языке)
В другом проекте была предпринята попытка АОП с использованием исходного кода в 2004 году с некоторым успехом. По сути, они построили объект аспекта на основе инструмента преобразования программ общего назначения под названием DMS и использовали его для внедрения кода в исходные файлы delphi до компиляции. На их аспектно-ориентированный язык прежде всего повлиял AspectJ.
http://www.gray -area.org / Research / GenAWeave / содержит ссылки на оригинальный документ и презентацию, а также некоторые видеоролики процесса преобразования.
Также возможно использовать инструментарий кода времени выполнения для достижения этой цели. Это методика, используемая некоторыми профилировщиками для вставки счетчиков и трассировки стека в работающий код без изменения исходного кода. Подобную технику можно использовать, чтобы внедрить сквозные задачи в статически скомпилированный исполняемый файл. Проект PinTool является хорошим примером этого.