Re[31]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 12:01
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>Господи. Непробиваемое мракобесие. Ты вообще читаешь что тебе пишут?

S>·>Повторяюсь. Для АОП не надо подменять не свой код. Надо делать подмену в своём коде, который может вызываться из чужого. Т.е. для АОП нужно не call site подменять, а делать замены в самом вызываемом коде. Нужно внедрять код _внутрь_ своих методов, а не в места их вызовов.
S>·>Разберись как PostSharp работает, например, что такое Compile Time Weaving.
S>Идет подмена ил кода. Но мне надо подменить свой код. Нахрена мне чужой?
Да ты читаешь что тебе пишут??? Не надо подменять чужой код. Compile Time Weaving ПОДМЕНЯЕТ СВОЙ КОД.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[32]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.11.23 12:02
Оценка:
Здравствуйте, ·, Вы писали:



S>>·>Ты мне льстишь, не я говорил, а разработчики АОП-библиотек. Я лишь для тебя перевёл на русский.

S>> Уги и как я без изменения IL сделаю сою обертку над методом?
·>Ну погляди как разработчики АОП-библиотек это делают.

S>>>>Тебе привели пример где этот AOP используется. Но ты все равно говоришь, что применить нельзя.

S>>·>Мда? И кто этот АОП использует, где, и для чего?
S>> То есть код ты не смотрел?
·>Смотрел.
Ииии
S>>·>Эту проблему решили библиотеки логгирования. Уже много лет как.
S>> IL код?
·>Нет. Погляди как устроены библиотеки логгирования.
Ну вот то что давал тебе ссылки PostSharp подменяет IL код, вторые через SG генерят новые методы, так как старый нельзя изменить
А InterceptsLocation создает отдельный класс и подменяет вызовы на новые мотоды, которые могут содержать старые.
Все досвидания!
и солнце б утром не вставало, когда бы не было меня
Re[32]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.11.23 12:03
Оценка:
Здравствуйте, ·, Вы писали:

S>>Идет подмена ил кода. Но мне надо подменить свой код. Нахрена мне чужой?

·>Да ты читаешь что тебе пишут??? Не надо подменять чужой код. Compile Time Weaving ПОДМЕНЯЕТ СВОЙ КОД.
Где этот Compile Time Weaving в C#?
и солнце б утром не вставало, когда бы не было меня
Re[33]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 12:05
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S>>> То есть код ты не смотрел?

S>·>Смотрел.
S> Ииии
Не нужно. Т.к. кривое решение несуществующей проблемы.

S>·>Нет. Погляди как устроены библиотеки логгирования.

S> Ну вот то что давал тебе ссылки PostSharp подменяет IL код, вторые через SG генерят новые методы, так как старый нельзя изменить
Угу. И это работает.

S>А InterceptsLocation создает отдельный класс и подменяет вызовы на новые мотоды, которые могут содержать старые.

Угу. Но это не работает.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[33]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 12:07
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>Да ты читаешь что тебе пишут??? Не надо подменять чужой код. Compile Time Weaving ПОДМЕНЯЕТ СВОЙ КОД.

S> Где этот Compile Time Weaving в C#?
https://www.postsharp.net/aop.net/compiletime-weaving
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[34]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.11.23 12:07
Оценка:
Здравствуйте, ·, Вы писали:

S>>А InterceptsLocation создает отдельный класс и подменяет вызовы на новые мотоды, которые могут содержать старые.

·>Угу. Но это не работает.

То есть код Игоря ты не смотрел? Но утверждаешь, что не работает!
и солнце б утром не вставало, когда бы не было меня
Re[35]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 12:16
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>>>А InterceptsLocation создает отдельный класс и подменяет вызовы на новые мотоды, которые могут содержать старые.

S>·>Угу. Но это не работает.
S>То есть код Игоря ты не смотрел? Но утверждаешь, что не работает!
Под "работает" я имею в виду не то что "компилируется без ошибок", а то что совершает ненулевую работу.
Вспомним контекст. Ты мне начал доказывать, что InterceptsLocation поможет разработчикам АОП-библиотек, т.к. это на хабре написано. Потом ты же привёл ссылку, где разработчики АОП-библиотеки прямо пишут, что InterceptsLocation не работает для них и требует совершенно другой подход. Я тебе объяснил и разжевал почему именно не работает. Об чём спор-то?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[34]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.11.23 12:18
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Serginio1, Вы писали:


S>>·>Да ты читаешь что тебе пишут??? Не надо подменять чужой код. Compile Time Weaving ПОДМЕНЯЕТ СВОЙ КОД.

S>> Где этот Compile Time Weaving в C#?
·>https://www.postsharp.net/aop.net/compiletime-weaving

Читаем

Существует в основном три способа изменить поведение .NET-программ на этапе сборки:

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

Инструменты:

Аспект#
SourceWeave.NET
Написание собственного компилятора
Вы можете либо начать с нуля, либо использовать существующий компилятор с открытым исходным кодом, такой как gcc или Mono. Явным недостатком является то, что вам нужно написать свой собственный компилятор или расширить существующий, что может быть выполнимо не для всех. Однако такой подход предоставляет практически неограниченные возможности.

Инструменты:

ЭОС
Модифицируя код MSIL
Позвольте стандартному компилятору завершить свою работу, затем прочитайте скомпилированную сборку, измените ее и запишите обратно. Это подход, используемый PostSharp.

Инструменты:

PostSharp
Aspect.NET . Этот инструмент основан на Phoenix.
AspectDNG . Этот инструмент основан на Cecil.
ComposeStar / StarLight
Gripper Loom.NET
Phx.Morph/Wicca . Этот инструмент основан на Phoenix.

Про AspectC# и SourceWeave.NET вообще информации не нашел. Все остальное это изменение IL
На самом деле есть еще способ, это на основании текущего проекта генерить новый проект со сгенеренными файлами.

Но нахрена мне зависеть от каких то библиотек, если я сам напишу легко, то, что мне нужно.
Вот Игорь написал свою библиотеку на InterceptsLocation. Она кстати есть в списке
https://github.com/igor-tkachev/AspectGenerator

То есть ты сам же и дал ссылку, подтверждающую, что InterceptsLocation для АОП нужна!
и солнце б утром не вставало, когда бы не было меня
Отредактировано 22.11.2023 12:27 Serginio1 . Предыдущая версия . Еще …
Отредактировано 22.11.2023 12:25 Serginio1 . Предыдущая версия .
Re[36]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.11.23 12:20
Оценка:
Здравствуйте, ·, Вы писали:


S>>>>А InterceptsLocation создает отдельный класс и подменяет вызовы на новые мотоды, которые могут содержать старые.

S>>·>Угу. Но это не работает.
S>>То есть код Игоря ты не смотрел? Но утверждаешь, что не работает!
·>Под "работает" я имею в виду не то что "компилируется без ошибок", а то что совершает ненулевую работу.
·>Вспомним контекст. Ты мне начал доказывать, что InterceptsLocation поможет разработчикам АОП-библиотек, т.к. это на хабре написано. Потом ты же привёл ссылку, где разработчики АОП-библиотеки прямо пишут, что InterceptsLocation не работает для них и требует совершенно другой подход. Я тебе объяснил и разжевал почему именно не работает. Об чём спор-то?

Ну ну. Вот Игорь разработчик АОП-библиотеки. Он показал пример. Но ты утверждаешь, что она ему не нужна!
и солнце б утром не вставало, когда бы не было меня
Re[37]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 12:33
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S> Ну ну. Вот Игорь разработчик АОП-библиотеки. Он показал пример. Но ты утверждаешь, что она ему не нужна!

Это такая же АОП-библиотека как я — папа римский.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[35]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 12:41
Оценка: 8 (1) :)
Здравствуйте, Serginio1, Вы писали:

S> Читаем

S>

S>Существует в основном три способа изменить поведение .NET-программ на этапе сборки:

Именно. И среди этих способов InterceptsLocation нету, и быть не может, и я тебе объяснил почему.

S> Про AspectC# и SourceWeave.NET вообще информации не нашел. Все остальное это изменение IL

Я бы объяснил тебе — почему, но лень, да и смысла нет, ты всё равно игнорируешь.

S> На самом деле есть еще способ, это на основании текущего проекта генерить новый проект со сгенеренными файлами.

Ну да, например, тут https://github.com/Jishun/RoslynWeave — попытка... и явно со своими проблемами.

S> То есть ты сам же и дал ссылку, подтверждающую, что InterceptsLocation для АОП нужна!

Нужен не этот конкретный InterceptsLocation proposal, а то о чём сказали разработчики АОП-бибилиотеки: "a more general and flexible approach".
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[24]: Новости C#12
От: IT Россия linq2db.com
Дата: 22.11.23 14:45
Оценка: 24 (1)
Здравствуйте, Serginio1, Вы писали:

S> Пример интересный. Но вот пришлось декомпилировать, что бы посмотреть Interceptors.cs


Декомпилировать не надо. Каталог где всё это генерируется указвается в здесь.

S>Кстати если декомпильнуть dll то там вместо


Ну да. В этом весь прикол. Пишем одно, получаем другое.
Если нам не помогут, то мы тоже никого не пощадим.
Re[24]: Новости C#12
От: IT Россия linq2db.com
Дата: 22.11.23 14:53
Оценка:
Здравствуйте, ·, Вы писали:

·>Даже хуже. Его подход в реальном приложении будет бесполезен.


Мне кажется он просто решил поиграться с фичей, нарвался на багу и решил на этом деле сгенерировать немного контента.
Если нам не помогут, то мы тоже никого не пощадим.
Re[25]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 14:59
Оценка:
Здравствуйте, IT, Вы писали:

IT>·>Даже хуже. Его подход в реальном приложении будет бесполезен.

IT>Мне кажется он просто решил поиграться с фичей, нарвался на багу и решил на этом деле сгенерировать немного контента.
Даже если эту багу пофиксят — предложенное им применение этой фичи на практике почти бесполезно.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[26]: Новости C#12
От: IT Россия linq2db.com
Дата: 22.11.23 15:03
Оценка: +1
Здравствуйте, ·, Вы писали:

IT>>Т.е. тебя интересует следущий сценарий:

·>Нет, конечно.

Понятно. Как обычно вся дискуссия крутится вокруг формулировок Тогда давай формулировать.

Классический АОП предполагает, что как разработку, так и модификацию метода средствами АОП осуществляет сам разработчик метода по его волеизлиянию. С помощью интерсепторов метод меняется во время его вызова по желанию того, кто этот метод использует. Это тоже вполне валидный сценарий, не вижу в этом ничего плохого, но всё же это другое. Немного шарма во всё это вот добавляет то, что в 95% случаев разработчик метода и его пользователь — это один и тот же человек/команда, которым абсолютно по барабану разница между АОП и интерсепторами, т.к. в этом случае результат тот же самый.

Но в принципе да. АОП через интерсепторы, это АОП слегка через жопу, хотя и не очень заметно и вполне употребимо. Задачу решает? Решает. В продакшин!
Если нам не помогут, то мы тоже никого не пощадим.
Re[25]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.11.23 15:35
Оценка:
Здравствуйте, IT, Вы писали:



IT>Декомпилировать не надо. Каталог где всё это генерируется указвается в здесь.


Да и в анализаторах есть Dependencies > Analyzers > AspectGenerator > AspectGenerator.AspectGenerator
Но компилятор для отладки требует Interceptors.cs вместо Interceptors.g.cs
и солнце б утром не вставало, когда бы не было меня
Отредактировано 22.11.2023 15:37 Serginio1 . Предыдущая версия .
Re[27]: Новости C#12
От: · Великобритания  
Дата: 22.11.23 15:38
Оценка:
Здравствуйте, IT, Вы писали:

IT>Понятно. Как обычно вся дискуссия крутится вокруг формулировок Тогда давай формулировать.

IT>Классический АОП предполагает, что как разработку, так и модификацию метода средствами АОП осуществляет сам разработчик метода по его волеизлиянию. С помощью интерсепторов метод меняется во время его вызова по желанию того, кто этот метод использует. Это тоже вполне валидный сценарий, не вижу в этом ничего плохого, но всё же это другое.
Не-не. Не путай цели и средства. Цель АОП — описывать аспекты кода. Т.е. задаём аспект "Вызов методов в слое DAO должен оборачиваться в DB-транзацкцию, для 'Load*' транзакция должна быть RO, для 'Save*' — RW". Теперь кто бы ни позвал Save или Load метод любого класса DAO — транзакция будет открыта и закрыта, с нужными пермишеннами.
Каким средством это добиваться — дело другое. Работающие варианты тут были упомянуты — генерировать обёртки вокруг классов, манипулировать байткодом во время компиляции или загрузки, создавать динамические прокси и т.п. И эти все варианты будут работать. InterceptsLocation — как средство, не подходит.

IT>Немного шарма во всё это вот добавляет то, что в 95% случаев разработчик метода и его пользователь — это один и тот же человек/команда, которым абсолютно по барабану разница между АОП и интерсепторами, т.к. в этом случае результат тот же самый.

IT>Но в принципе да. АОП через интерсепторы, это АОП слегка через жопу, хотя и не очень заметно и вполне употребимо. Задачу решает? Решает. В продакшин!
Ок... Могу согласится, что это заработает на небольшом одномодульном проекте, без единой 3rd party зависимости (включая стандартную библиотеку Платформы). Ну там небольшую консольную утилитку состряпать.
Впрочем в этом случае возникнет вопрос — накой в небольшом одномодульном проекте одного человека нужен АОП?!
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 22.11.2023 15:40 · . Предыдущая версия .
Re[26]: Новости C#12
От: IT Россия linq2db.com
Дата: 22.11.23 15:40
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Да и в анализаторах есть Dependencies > Analyzers > AspectGenerator > AspectGenerator.AspectGenerator

S>Но компилятор для отладки требует Interceptors.cs вместо Interceptors.g.cs

Косяки студии/решарпера. Там и с навигацией всё плохо. Железно работает только отладчик. Он находит сорсы в любом месте. Но там похоже всё через pdb, поэтому работает.
Если нам не помогут, то мы тоже никого не пощадим.
Re[27]: Новости C#12
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.11.23 15:41
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Serginio1, Вы писали:


S>>Да и в анализаторах есть Dependencies > Analyzers > AspectGenerator > AspectGenerator.AspectGenerator

S>>Но компилятор для отладки требует Interceptors.cs вместо Interceptors.g.cs

IT>Косяки студии/решарпера. Там и с навигацией всё плохо. Железно работает только отладчик. Он находит сорсы в любом месте. Но там похоже всё через pdb, поэтому работает.

Сейчас проверил идет в g.cs. Правда обновился до 17.8.1

Круть!
и солнце б утром не вставало, когда бы не было меня
Re[24]: Новости C#12
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.11.23 15:43
Оценка:
Здравствуйте, ·, Вы писали:

·>... но это бесполезный пример, игрушечный. Да и вообще, ведь это твой код, проще сразу писать Console.WriteLine("You chose " + colour.ToStringFast()), зачем эта вся котовасия вообще неясно.

Ну так он и пишет — что надо не забыть использовать ToStringFast вместо ToString. Его пример должен, по идее, починить забывчивость.

·>В реальном коде будет

·>
·>public void PrintColours(List<Colour> colours)
·>{
·>    Logger.Info("You chose {colours}", colours); // и что здесь подменять?!
·>}
·>

С этим — хуже, да.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.