Реализация механизма внедрения аспектов в целевой код для аспектно- ориентированной системы разработки Aspect.NET Дмитрий Григорьев, Под научным руководством.

Презентация:



Advertisements
Похожие презентации
ИНТЕГРАЦИЯ МЕТОДОВ ИНЖЕНЕРИИ ЗНАНИЙ И ИНЖЕНЕРИИ ПРОГРАММ СИСТЕМА УПРАВЛЕНИЯ ЗНАНИЯМИ KNOWLEDGE.NET Участники проекта Новиков Антон Владимирович Сигалин.
Advertisements

©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Платформа Microsoft.NET Кафедра системного программирования С.-Петербургского государственного университета Андрей А.Терехов,
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Методология объектно- ориентированного программирования.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
ФИЛОСОФИЯ.NET Любому современному программисту, который желает идти в ногу с последними веяниями, каждые несколько лет приходится переучиваться.
Высокоуровневые методы информатики и программирования Лекция 9 Делегаты.
Высокоуровневые методы информатики и программирования Лекция 10 События.
Языки и методы программирования Преподаватель – доцент каф. ИТиМПИ Кузнецова Е.М. Лекция 7.
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
1 © Luxoft Training 2012 Java: расширенные вопросы Модуль #8.
Автоматическая генерация кода программ с явным выделением состояний Канжелев С.Ю. магистрант СПбГУ ИТМО Шалыто А.А. доктор технических наук профессор СПбГУ.
Аспектно-ориентированное программирование. Сквозная функциональность Ведение журналовАвторизация Модуль оформления заказов Модуль принятия товаров.
Проф. В.К.Толстых, Технологии разработки Internet- приложений ASP.NET приложения – обработка ошибок страниц и приложения, Global.aspx.
Обзор возможностей Инверсия управления Аспектно-ориентированное программирование.
ОБЪЕКТНО- ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ (ООП) 1.
ДЕЛЕГАТЫ Лекция 7 1. Зачем нужны делегаты 2 И данные, и код располагаются в памяти компьютера по определенным адресам. Передача адресов данных в C# происходит.
1 Диаграммы реализации (implementation diagrams).
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Транксрипт:

Реализация механизма внедрения аспектов в целевой код для аспектно- ориентированной системы разработки Aspect.NET Дмитрий Григорьев, Под научным руководством проф., д.т.н. В.О.Сафонова Кафедра информатики математико-механического факультета Санкт-Петербургского государственного университета

Основные цели Реализовать спецификацию языка Aspect.NET ML, предложенную В.О. Сафоновым Развить ее для решения прикладных задач Реализовать совместимость компонента с GUI и сторонними утилитами Обеспечить использование Aspect.NET в привычном процессе разработки Реализация на основе среды построения компиляторов MS Phoenix СПбГУ,

3 Введение в АОП (1) Аспектно-ориентированное программирование (АОП) – это попытка решить проблемы разработки сложного программного обеспечения. Каждая программная компонента (сборка, класс, метод, и пр.) решает определенную логически независимую задачу (запись событий, авторизация, безопасность, проверки,…).

СПбГУ, Введение в АОП (2) В результате, программа состоит изперемешанного кода – спагетти. Очень трудно изъять, добавить или заменить такой логически связанный код (сквозная функциональность) из общей системы.

СПбГУ, Решение АОП Переместить сквозную функциональность из общего кода системы в отдельные модули (аспекты) Описать их точки местонахождения в целевом коде на метаязыке Сплести их вместе

СПбГУ, Подходы АОП реализаций Расширение существующего языка (AspectJ, Aspect#) Минус: необходимость переписывать компилятор Перехват потока управления во время исполнения (Loom.NET, Spring.NET, RAIL) Минус: потеря контроля, низкая производительность -Статическое вплетение в сборки (Phx.Morph, Aspect.NET) Плюсы: 1.Высокая производительность, 2.Явная доступность результатов (через средства декомпиляции) 3.Совместимость с существующими.NET инструментами

СПбГУ, Прикладные задачи АОП Реализация безопасности Authorization, Auditing, Identity / Impersonation, Profile, Authentication, Secure Communications, Encryption of state, Signature verification Управление компонентами Instrumentation & Tracing, Exception Handling, Biz Monitoring, Configuration, Timeouts, Priorities, Service Location, Versioning, Behavior visibility, Replication, Journaling Управление состоянием Transactions, Validation, Synchronization, Contract Enforcement, Rerouting & Fan-out, Pre & Post Conditions, Asynch to Synch, Correlation, duplicate request handling, Caching, Persistence, Checkpoint & resume, parameter transformations

СПбГУ, Цели Aspect.NET Aspect.NET – система АОП разработки, которая позволяет реализовывать некоторую функциональность внутри аспекта и внедрять ее в целевые сборки. Таким образом, логически связанные компоненты группируются в отдельные аспекты, что делает бизнес-код простым Aspect.NET реализован как надстройка над Visual Studio.NET, чтобы облегчить разработку АОП программ.

СПбГУ, Aspect.NET ML Определение аспекта может быть дано на простом метаязыке Aspect.NET.ML. Метаязык позволяет задавать множество точек внедрения, группировать их в структуры (ruleset) и переиспользовать в других аспектах. Аспект содержит: Данные (Data) (в виде полей) Модули (Modules) (в виде методов аспекта) Действия (Actions) (открытые методы, которые вызываются в специальных точках целевого кода) Правила внедрения (Weaving rules) (определяют множество данных точек внедрения)

СПбГУ, Реализация Aspect.NET ML Отдельный конвертер переводит с описания на метаязыке в корректный.NET класс с метаописаниями в виде пользовательских атрибутов. Затем применяется стандартный компилятор. В принципе, аспект – это наследник специального класса Aspect, методы которого аннотированы специальными АОП атрибутами.

СПбГУ, Aspect Library (DLL) %aspect Test//ML language public class Test { %modules private static void TestRun() { WriteLine(test); } %rules Aspect.ML Converter C# Compiler public class Test: Aspect//Attribute annotation { [AspectAction(%before %call Write*")] public static void TestRunAction() { Test.TestRun(); }

СПбГУ, Пример на Aspect.NET ML %aspect Politeness { %modules private static void SayScanningHello() { Console.WriteLine("Welcome to Aspect.NET scanning system!"); } %rules %before %call *SomeMethod %action public static void SayScanningHelloAction() { Politeness.SayScanningHello(); } }// Politeness

СПбГУ, Пользовательские атрибуты (пример) public class Politeness: Aspect { private static void SayScanningHello() { Console.WriteLine("Welcome to Aspect.NET scanning system!"); } [AspectAction(%before %call *SomeMethod)] public static void SayScanningHelloAction() { Politeness.SayScanningHello(); } }// Politeness

СПбГУ, Текущие возможности Aspect.NET ML (1/4) Вставка действий перед (before), после (after) или вместо (instead) инструкции call

СПбГУ, Текущие возможности Aspect.NET ML(2/4) Действия аспекта имеют полный доступ к контексту в точке выполнения через свойства родительского класса Aspect: Object This; \\this keyword (object of A class) Object TargetObject;\\p.TargetMethod(..); MemberInfo TargetMemberInfo; \\TargetMethod as MethodInfo Object RetValue; \\object ret=p.TargetMethod(..); Type WithinType;\\this.GetType(); (e.g. A) MethodBase WithinMethod; \\this.CurrentMethod(); (AMethod) string SourceFilePath;\\*.cs filepath string SourceFileLine.\\source line number And more…

СПбГУ, Текущие возможности Aspect.NET ML(3/4) Правила внедрения задаются маской и регулярным выражением. %before %call Namespace.Class.MethodName или %before %call *MethodName Фильтрация по сигнатуре целевого метода %instead %call static public void *Method(float, string,..)

СПбГУ, Текущие возможности Aspect.NET ML(4/4) Захват аргументов AspectAction(%after %call *Method(int) && args(arg[1])) static public void MethodAction(int i) { Console.WriteLine({0}, i); } Дополнительные ограничения на расположение целевых точек %within(*SomeType) %withincode(*SomeMethod) %instead %call *Method && %within(*MyType) && %!withincode(*.ctor)

Aspect.NET 3.0: Перспективы развития (1/4) Ограничение точек внедрения классами или методами помеченными определенными атрибутами %after %call [Serializable]*.* // любой метод всех классов, помеченных атрибутом Serializable %after %call *Class1.[STAThread]*// любой метод класса Class1, помеченный как STAThread %after %call * && %!within([Serializable]*)//любой метод, вызов которого встречается в классах, не помеченных как Serializable СПбГУ,

Aspect.NET 3.0: Перспективы развития (2/4) Пометка классов, методов, полей определенным атрибутом На ML: %mark *Class1 %with [Serializable] На C#: [AspectScriptAction(%mark *Class1 %with [Serializable])] interface SerializableAction {} class MyAspect: Aspect, SerializableAction {} СПбГУ,

Aspect.NET 3.0: Перспективы развития (3/4) Правила внедрения описываются в отдельных XML Прежнее определение аспекта public class UsageLicensingAspect: Aspect { [AspectAction("%before %call *Method(int, double) && %args(arg[1]) && %within(*MainClass)")] static public void ActionMethod1(float f) { Console.WriteLine("ActionMethod1: {0}",f); } … Выполнение внедрения: weaver.exe -scan -aspects UsageLicensingAspect.dll -in BankManagement.exe -out joinpoints.xml СПбГУ,

Aspect.NET 3.0: Перспективы развития (4/4) Новое представление аспекта public class UsageLicensingAspect: Aspect { static public void ActionMethod1(float f) { Console.WriteLine("ActionMethod1: {0}",f); } XML определение действий аспекта СПбГУ,

Aspect.NET 3.0: Возможности для протоколирования (1/3) Первый пример: Все блоки catch() должны записывать информацию о возникшем исключении в журнал (Error or Warn level). Joinpoint: %before %catch(*SomeExceptionType) && %withincode(*CallerMethodName1) %before %throw(*SomeExceptionType) && %withincode(*CallerMethodName2) %before %fire (*SomeEventType) && %withincode(*CallerMethodName3) Работа с экземпляром объекта исключения внутри действия аспекта ведется через свойство: Exception Aspect.CurrentException() Работа с массивом аргументов целевого действия: object[] Aspect.Args() СПбГУ,

Aspect.NET 3.0: Возможности для протоколирования (2/3) Практический пример 1: AspectAction(%before %catch(*SomeExceptionType) && %withincode(public *ClassA.*)) static public void ExceptionAction() { Console.WriteLine(WithinMethod.ToString()); Console.WriteLine(CurrentException.ToString()); TraceArgs(Args); //Printing Args array } СПбГУ,

Aspect.NET 3.0: Возможности для протоколирования (3/3) Практический пример 2. Проверка входных аргументов: AspectAction(%after %call *GetProduct) static public void GetProductAction() { foreach(object o in Args) { if(o is null) Console.WriteLine(WithinMethod.ToString()+ ": Argument of type " + o.ToString()+" is null"); } Console.WriteLine("Return value is "+RetValue.ToString()); } СПбГУ,

Алгоритм внедрения аспектов Компоновщик принимает исходную сборку, сборку аспекта и отладочную информацию. Извлечение заданных точек внедрения, проход по исходной сборке и их обнаружение. Результат в виде XML файла передается редактору, который фильтрует нужные из точек внедрения. Вставка действий аспекта в нужные точки внедрения и создание результирующей сборки. СПбГУ,

СПбГУ, Aspect.NET Framework Design Compiler Application Source Code Aspect Library Aspect Source Code Aspect.NET.ML Converter Application Weaver User Target Application Aspect.NET Framework

СПбГУ, Aspect.NET Framework

СПбГУ, Microsoft Phoenix Механизм рефлексии недостаточен для модификации MSIL сборок (даже в.NET 3.5). Microsoft Phoenix – это среда для постороения компиляторов и широкого спектра инструментов для анализа программ, оптимизации и тестирования Phoenix оборачивает MSIL инструкции в объекты высокого уровня. Инструментарий на базе Phoenix может быть применен на стадии компиляции. Phoenix позволяет работать с отладочной информацией Прямое взаимодействие с командой разработчиков Phoenix в Microsoft Research.

СПбГУ, Результаты после декомпиляции BankAccount account1 = new BankAccount(); Aspect.InternalSetArgsTypes("float"); Aspect.InternalSetMemberName("BankManagement.BankAccount.deposit"); Aspect.InternalSetTargetObject(account1); UsageLicensingAspect.DepositWrapper(20f);\\instead of \\account1.deposit(20) Aspect.InternalSetArgsTypes("float"); Aspect.InternalSetMemberName("BankManagement.BankAccount.withdraw) Aspect.InternalSetTargetObject(account1); UsageLicensingAspect.WithdrawWrapper(20f); \\instead of \\account1. withdraw(20) Console.WriteLine("Final balance is {0}", account1.Balance);

Результаты Разработана и реализована расширенная спецификация Aspect.NET ML Реализован алгоритм обнаружения заданных точек внедрения и внедрения в них действия аспекта Интеграция с современными средствами разработки и сторонними утилитами Минимизирован семантический разрыв между внедрением на бинарном уровне и изменениями в исходном коде СПбГУ,

СПбГУ, Публикации Safonov V. O., Grigoriev D. Aspect.NET: concepts and architecture // NET Developer's Journal. 2005, #7, P Safonov V. O., Grigoriev D. Aspect.NET an aspect-oriented programming tool for Microsoft.NET. // In: 110th Anniversary of Radio Invention; St. Petersburg; 2006, P Григорьев Д.А., Грачев М.К., Масленников А.И. Сафонов В.О: Адаптация методологии АОП для практического применения на платформе Microsoft.NET. // Тезисы докладов конкурса-конференции Технологии Microsoft в теории и практике программирования, изд-во СПбГПУ, Safonov V.O., Grigoryev D., Gratchev M. Aspect.NET – aspect- oriented toolkit for Microsoft.NET based on Phoenix and Whidbey..NET Technologies University of West Bohemia Campus Bory. May 29 – June 1, Full Papers Proceedings, Pilsen, Czech Republic, 2006