我想访问当前正在运行或即将运行的字节码,以便检测某些指令并采取特定操作(取决于说明)。简而言之,我想监视字节码以增加安全控制(参见编辑#1的解释)。
这可能吗?我知道有一些AOP框架可以通知你特定的事件,比如对字段的访问或方法的调用,但是我想跳过那个额外的层,在整个执行过程中自己查看所有的字节码申请书。
我已经查看了以下问题(......在许多其他问题中;)):
Preprocessing C# - Detecting Methods
What CLR/.NET bytecode tools exist?
以及几个AOP框架(虽然不是非常详细,因为它们似乎没有我需要的东西)并且我熟悉Mono.Cecil。
我很欣赏其他建议,但我不想介绍AOP框架的开销,当我真正需要的是访问字节码时,没有他们添加的所有内容以使其更加用户友好(。 ..当你不想进入低级别时,这是非常有用的东西。)
谢谢:)
编辑#1 :有关我想要做的更多详情。
基本上,我有一个C#应用程序,我需要监视它想要运行的指令,以便检测对字段(操作Ldfld
和Stfld
)的读或写操作,并在之前插入一些指令读/写发生:我可能需要获取锁,或者如果失败则中止操作。此外,我可能需要更新读取日志(如果是读取)或写入日志(如果是写入)。
事实上,我真正想做的是用我自己的自定义代码替换读/写指令,但它失败了我认为我可以管理只是在之前插入一些指令后。
编辑#2: PostSharp
戴夫建议我使用PostSharp
问题是在编译时我仍然不知道我需要编织哪些类,所以我想延迟它,直到它们被加载。据我所知,PostSharp无法实现这一点?如果我错了,请纠正我。
我知道PostSharp会load-time static weaving,但显然是"there is currently no "off-the-shelf" way to perform it"(但请注意,这篇文章来自PostSharp 1.5;也许这已经改变了)。我想这仍然比仅仅做一切更容易,但我找不到PostSharp在这种情况下如何帮助我的任何信息。我想我会在PostSharp论坛上提问。
答案 0 :(得分:1)
什么样的“安全控制”?您是否查看了.NET框架提供的代码访问安全性?
http://msdn.microsoft.com/en-us/library/930b76w0%28VS.80%29.aspx
答案 1 :(得分:1)
答案是否定的。您可以使用(极低级别和非托管代码)Profiling API来接收某些事件的通知,但不能访问字段,这是我想要的。此外,它不应该用于生产:
(来自上一个链接)
在生产环境中进行分析 具有高可用性要求。 分析API已创建为 支持开发时诊断。 它没有经历严谨 支持生产所需的测试 的环境中。