如何遍历一个程序中所有方法?

马少华 2015-01-09 03:57:23
需求是这样的,现在要对一个项目进行优化,就是删减一些功能。把一些使用很少的功能优化掉。
但是以前开发的时候并没有考虑到这个问题。
现在想对程序改造,给每个方法加个统计功能,但是如果一个一个方法的改工作量太大了。
现在想知道c#里面有没有类似“hook”的东西所有的方法在执行的时候,事先执行我的功能统计函数.
请指教!
...全文
757 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
马少华 2015-01-16
  • 打赏
  • 举报
回复
引用 44 楼 Z65443344 的回复:
如果只是菜单,遍历菜单,给每个item的点击事件追加一个相同的click事件,然后事件里判断引发事件的sender,把信息存文件或数据库里就ok了 一个菜单(或按钮,或别的什么)可以绑定多个相同的事件,事件会依次触发 不过你需要将代码写进designer里,要在执行实际的逻辑之前先执行这个事件 否则如果菜单功能是弹出模式窗体之类的阻塞代码,后续事件有可能会无法得到执行
wpf里面的tabcontrol,未激活的选项卡里面的button找不到
於黾 2015-01-15
  • 打赏
  • 举报
回复
如果只是菜单,遍历菜单,给每个item的点击事件追加一个相同的click事件,然后事件里判断引发事件的sender,把信息存文件或数据库里就ok了 一个菜单(或按钮,或别的什么)可以绑定多个相同的事件,事件会依次触发 不过你需要将代码写进designer里,要在执行实际的逻辑之前先执行这个事件 否则如果菜单功能是弹出模式窗体之类的阻塞代码,后续事件有可能会无法得到执行
马少华 2015-01-15
  • 打赏
  • 举报
回复
引用 36 楼 sp1234 的回复:
[quote=引用 35 楼 kinbridge 的回复:] 学习大半年了。怎么就没有听过可以遍历一个项目中的全部方法
lz 是想统计每一个方法的执行时间。而这个帖子的标题,纯粹是误导人的。它分不清楚方法的静态定义跟动态调用统计之间的区别。 当然可以遍历应用程序中调用的所有程序集中的所有可执行方法。但是lz根本不是这样的意思,他只是道听途说然后曲解意思,走上了经常把老板带上“不归路”的道路。[/quote] 我想统计是各功能菜单点了多少次
马少华 2015-01-15
  • 打赏
  • 举报
回复
引用 38 楼 SPFarm 的回复:
[quote=引用 3 楼 sp1234 的回复:] [quote=引用 楼主 evionmzs 的回复:] 需求是这样的,现在要对一个项目进行优化,就是删减一些功能。把一些使用很少的功能优化掉。
程序的启动程序“使用很少”,你干脆把所有的程序启动部分都“优化掉”得了。 老板随口一说,并不是让程序员胡乱执行的。不懂就直接跟老板说“做不到”就行了,不要用完全错误的执行方法来应付老板。[/quote] 很赞成您的观点。 这样优化程序太危险了,甚至都不叫优化。。。[/quote] 是功能菜单的入口函数
马少华 2015-01-15
  • 打赏
  • 举报
回复
引用 31 楼 h598937749 的回复:
感觉那样不太好就像楼上说的有的方法一个月都不执行一次但是不能删除,还不如把公用的代码提取成通用方法靠谱点
引用 33 楼 wyx100 的回复:
引用 31 楼 h598937749 的回复:
感觉那样不太好就像楼上说的有的方法一个月都不执行一次但是不能删除,还不如把公用的代码提取成通用方法靠谱点
是菜单的入口函数
S314324153 2015-01-13
  • 打赏
  • 举报
回复
最多有用反射遍历Dll的方法和属性,程序的还真没听说过
相思梦 2015-01-12
  • 打赏
  • 举报
回复
Hook C#只能用消息钩子,函数钩子是不行的,那是C的玩意 如果你只是想遍历NET程序的类与方法,用反射就好了。
  • 打赏
  • 举报
回复
引用 35 楼 kinbridge 的回复:
学习大半年了。怎么就没有听过可以遍历一个项目中的全部方法
lz 是想统计每一个方法的执行时间。而这个帖子的标题,纯粹是误导人的。它分不清楚方法的静态定义跟动态调用统计之间的区别。 当然可以遍历应用程序中调用的所有程序集中的所有可执行方法。但是lz根本不是这样的意思,他只是道听途说然后曲解意思,走上了经常把老板带上“不归路”的道路。
kinbridge 2015-01-11
  • 打赏
  • 举报
回复
学习大半年了。怎么就没有听过可以遍历一个项目中的全部方法
SPFarmer 2015-01-11
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
[quote=引用 楼主 evionmzs 的回复:] 需求是这样的,现在要对一个项目进行优化,就是删减一些功能。把一些使用很少的功能优化掉。
程序的启动程序“使用很少”,你干脆把所有的程序启动部分都“优化掉”得了。 老板随口一说,并不是让程序员胡乱执行的。不懂就直接跟老板说“做不到”就行了,不要用完全错误的执行方法来应付老板。[/quote] 很赞成您的观点。 这样优化程序太危险了,甚至都不叫优化。。。
lkf181 2015-01-10
  • 打赏
  • 举报
回复
没有吧,,,,,,,,,,,,,,,,,,,,,
h598937749 2015-01-10
  • 打赏
  • 举报
回复
感觉那样不太好就像楼上说的有的方法一个月都不执行一次但是不能删除,还不如把公用的代码提取成通用方法靠谱点
lizejia009 2015-01-10
  • 打赏
  • 举报
回复
这都可以吗?
wyx100 2015-01-10
  • 打赏
  • 举报
回复
引用 31 楼 h598937749 的回复:
感觉那样不太好就像楼上说的有的方法一个月都不执行一次但是不能删除,还不如把公用的代码提取成通用方法靠谱点
winnowc 2015-01-09
  • 打赏
  • 举报
回复
首先你搜索下PresentationTraceSources类相关的文章,看看WPF内置的trace能否满足需要。如果可以,这个涉及的工作量应该最小。 其它方案有: 如果是开发人员来控制程序使用,可以用profiler的方式,有现成的代码覆盖率工具,比如dotCover、NCover之类,可以进行一系列安排好的场景来操作,根据覆盖率看哪些代码没有被覆盖。 优点:无需改动程序,粒度可以到每一行代码。 缺点:严重影响性能,所以不可能在这种方式下让客户使用,只能自己安排场景测试。 如果需要收集客户的使用数据,那最好的方案还是AOP。有两种情况: 1. 原来就是基于IoC/DI框架来搭建的。这种实施动态AOP就很简单,改改IoC/DI的配置就能实现,比如在创建一些关键对象时做计数或log,或者使用动态代理拦截方法。如果没有使用IoC/DI框架,但是自己实现了类似的功能也行。比如有自己的factory和command模式,也能实现拦截。 优点:代码改动少并且集中,并且完全是代码级别的修改(对比静态AOP)。 缺点:依赖原来的设计。 2. 原来没有基于IoC/DI框架,自己的设计也没有合适的拦截点,那就只能使用静态AOP方式在程序编译好之后织入一些用来计数和log的代码。做的最好的应该还是商业化的PostSharp,也有一些免费工具,比如 Spring.net、Fody等等。有些支持通过配置批量定义目标、有些只支持通过attribute来定义目标。当然也有更底层的办法,使用Cecil或者dnlib来自己修改程序集。 优点:无需依赖原来的设计,基本都能用。 缺点:程序集级别修改,增加了理解的难度。 (还有一些混淆工具也提供了feature usage report的功能,比如smart assembly,好不好用我就不知道了)
emailtome 2015-01-09
  • 打赏
  • 举报
回复
引用 楼主 evionmzs 的回复:
需求是这样的,现在要对一个项目进行优化,就是删减一些功能。把一些使用很少的功能优化掉。 但是以前开发的时候并没有考虑到这个问题。 现在想对程序改造,给每个方法加个统计功能,但是如果一个一个方法的改工作量太大了。 现在想知道c#里面有没有类似“hook”的东西所有的方法在执行的时候,事先执行我的功能统计函数. 请指教!
YES
引用 28 楼 lincolnandlinda 的回复:
有方法,可以考虑使用AOP,最典型的应用就是进行方法之前和方法结束之间执行自定义代码,现在最好用的AOP框架应该是PostSharp(可惜需要付费)
free www.castleproject.org/projects/dynamicproxy
lincolnandlinda 2015-01-09
  • 打赏
  • 举报
回复
有方法,可以考虑使用AOP,最典型的应用就是进行方法之前和方法结束之间执行自定义代码,现在最好用的AOP框架应该是PostSharp(可惜需要付费)
江南小鱼 2015-01-09
  • 打赏
  • 举报
回复
引用 22 楼 evionmzs 的回复:
[quote=引用 21 楼 Z65443344 的回复:] 如果已经耦合严重,说明前期设计有严重问题,根本就是边想边做,根本没有统一规划 你这个项目不做好推翻重来的打算,估计是没什么可能模块化了
确实是这样的,各位的什么好的设计经验吗? 重做当然不是眼下最急的问题[/quote] 写个小工具,反射每个dll里面的方法,在方法体追加你的公共代码调用部分,其他没有更省事的方法了! 或者重构你的代码,一个口子提交方法体,在这个口子里增加公共代码
马少华 2015-01-09
  • 打赏
  • 举报
回复
我的思路是找出所有的button和所有的menuitem 然后在他们的click绑定一个新的统计函数. 但是现在找不全button和menuitem 项目是wpf的。
华芸智森 2015-01-09
  • 打赏
  • 举报
回复
估计是先反射,取所有方法名.然后对代码 LIKE %NAME(%
加载更多回复(24)

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧