inversionhourglass / Rougamo

Compile-time AOP component. Works with any method, whether it is async or sync, instance or static. Uses an aspectj-like pattern to match methods.
MIT License
393 stars 47 forks source link

这个配置现在是有的吗?内联织入方式。 #82

Closed food4321 closed 1 month ago

food4321 commented 1 month ago
          这个配置现在是有的吗?

  默认使用3.0版本的代理调用织入方式,可通过配置修改织入方式

(配置的方式为修改FodyWeavers.xml文件中的配置)

Originally posted by @inversionhourglass in https://github.com/inversionhourglass/Rougamo/issues/68#issuecomment-2094667061

Originally posted by @food4321 in https://github.com/inversionhourglass/Rougamo/issues/81#issuecomment-2345213330

inversionhourglass commented 1 month ago

这个配置现在是有的吗?

4.0版本开始就不支持了,这个只是3.0版本的过渡配置。内联织入在未使用async/await语法的方法处理上容易让人误解,你可以看一下我3.0版本的博客 不同织入方法带来的影响

food4321 commented 1 month ago

这个配置项能否继续支持,或者 可以选择 内联植入还是代理方式。 因为有的项目有可能都没有使用 async 方式。

为了支持 async / await 而 clone 一个新 $Rougamo_ 方法, 这本身就带来 clone是出错的几率 并且在触发异常时,StackTrace 追中 堆栈出现 $Rougamo (如果有嵌套) 将会出现大量的 没有必要的 $Rougamo StackFrame 这也带来了不方便。

或者像postsharp 一样 如果有async 的情况 重新定义 IAsyncStateMachine 类去处理,是否可行?

inversionhourglass commented 1 month ago

首先,非常抱歉新的方式中存在大量的bug给你们带来不好的使用体验。

支持两种织入方式对我来说就是双倍的维护工作量,肉夹馍的升级维护工作也并不像想象中那么轻松,确实也没有精力去维护两种织入方式。

代理织入解决的也不是使用了async语法的情况,而是没有使用async语法的情况,这个你可能需要仔细理解博客中举的例子。虽说确实有类似你这种情况几乎不使用异步和Task/ValueTask,但现在异步已是主流,作为一个开源项目肯定更倾向于兼顾主流问题。同时代理织入也不仅仅用来解决async语法差异,其他一些功能也依赖这种实现方式,比如步入调试、异步切面等。

异常中的堆栈信息确实会显得有些臃肿,这个后续查一下有没有方式可以忽略部分堆栈信息吧,但也只能从这个方向来处理问题,不会考虑切回内联织入。

.NET发展多年,拥有各式各样的元数据类型和语法糖,肉夹馍确实难以全部覆盖,比如你反馈的几个问题P/Invoke、矩形数组、简单的try { throws } catch { throws },在Web开发中并不常见,所以非常依靠你们的反馈。

升级导致遇到各种之前不存在的问题,这个确实很抱歉,也很理解长此以往可能会让你们对肉夹馍失去信心,但也希望你们理解,IL底层项目存在一定难度,个人精力确实无法支持到所有的需求。希望你们能够继续给予支持,对于bug我会尽快修复,尽量少的影响到你们的工作进度和流程,非常感谢。