【发布时间】:2010-04-13 15:35:56
【问题描述】:
我想访问当前正在运行或即将运行的字节码,以便检测某些指令并采取特定操作(取决于指令)。简而言之,我想监控字节码以添加安全控制(请参阅 EDIT #1 进行解释)。
这可能吗?我知道有一些 AOP 框架会通知您特定事件,例如对字段的访问或方法的调用,但我想跳过那个额外的层,在整个执行过程中自己查看所有字节码应用程序。
我已经查看了以下问题(...以及许多其他问题;)):
Preprocessing C# - Detecting Methods
What CLR/.NET bytecode tools exist?
以及几个 AOP 框架(虽然不是很详细,因为它们似乎并不能完全满足我的需要)而且我对 Mono.Cecil 很熟悉。
我很欣赏其他建议,但是当我真正需要的是访问字节码时,我不想介绍 AOP 框架的开销,而没有他们添加的所有内容以使其更加用户友好(. .. 当你不想去低级时,这无疑是非常有用的东西)。
谢谢:)
EDIT #1:关于我想要做什么的更多细节。
基本上,我有一个 C# 应用程序,我需要监视它要运行的指令,以检测对字段的读取或写入操作(操作 Ldfld 和 Stfld)并在读/写之前插入一些指令发生:我可能需要获取锁,或者如果失败则中止操作。此外,我可能需要更新读取日志(在读取的情况下)或写入日志(在写入的情况下)。
事实上,我真正想做的是用我自己的自定义代码替换读/写指令,但它失败了,我想我可以在之前插入一些指令,然后之后。
编辑 #2: PostSharp
Dave 建议我使用 PostSharp
问题是在编译时我仍然不知道我需要编织哪些类,所以我想推迟到它们被加载。据我了解,PostSharp 不可能做到这一点?如果我错了,请纠正我。
我知道 PostSharp 有 load-time static weaving,但显然是 "there is currently no "off-the-shelf" way to perform it"(但请注意,这篇文章来自 PostSharp 1.5;也许这已经改变了)。我想这仍然比自己做所有事情要容易,但我找不到任何关于 PostSharp 在这种情况下如何帮助我的信息。我想我会在 PostSharp 论坛上提问。
【问题讨论】:
标签: c# .net clr monitoring bytecode