有没有办法在.NET中访问当前正在运行的字节码/ IL / CLR?

时间:2010-04-13 15:35:56

标签: c# .net clr monitoring bytecode

我想访问当前正在运行或即将运行的字节码,以便检测某些指令并采取特定操作(取决于说明)。简而言之,我想监视字节码以增加安全控制(参见编辑#1的解释)。

这可能吗?我知道有一些AOP框架可以通知你特定的事件,比如对字段的访问或方法的调用,但是我想跳过那个额外的层,在整个执行过程中自己查看所有的字节码申请书。

我已经查看了以下问题(......在许多其他问题中;)): Preprocessing C# - Detecting Methods
What CLR/.NET bytecode tools exist?
以及几个AOP框架(虽然不是非常详细,因为它们似乎没有我需要的东西)并且我熟悉Mono.Cecil。

我很欣赏其他建议,但我不想介绍AOP框架的开销,当我真正需要的是访问字节码时,没有他们添加的所有内容以使其更加用户友好(。 ..当你不想进入低级别时,这是非常有用的东西。)

谢谢:)


编辑#1 :有关我想要做的更多详情。

基本上,我有一个C#应用程序,我需要监视它想要运行的指令,以便检测对字段(操作LdfldStfld)的读或写操作,并在之前插入一些指令读/写发生:我可能需要获取锁,或者如果失败则中止操作。此外,我可能需要更新读取日志(如果是读取)或写入日志(如果是写入)。

事实上,我真正想做的是用我自己的自定义代码替换读/写指令,但它失败了我认为我可以管理只是在之前插入一些指令后。


编辑#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论坛上提问。

2 个答案:

答案 0 :(得分:1)

什么样的“安全控制”?您是否查看了.NET框架提供的代码访问安全性?

http://msdn.microsoft.com/en-us/library/930b76w0%28VS.80%29.aspx

http://www.codeproject.com/KB/security/UB_CAS_NET.aspx

答案 1 :(得分:1)

答案是否定的。您可以使用(极低级别和非托管代码)Profiling API来接收某些事件的通知,但不能访问字段,这是我想要的。此外,它不应该用于生产:

  

(来自上一个链接)

     

在生产环境中进行分析   具有高可用性要求。   分析API已创建为   支持开发时诊断。   它没有经历严谨   支持生产所需的测试   的环境中。