【问题标题】:Is there a way in .NET to access the bytecode/IL/CLR that is currently running?.NET 中有没有办法访问当前正在运行的字节码/IL/CLR?
【发布时间】: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# 应用程序,我需要监视它要运行的指令,以检测对字段的读取或写入操作(操作 LdfldStfld)并在读/写之前插入一些指令发生:我可能需要获取锁,或者如果失败则中止操作。此外,我可能需要更新读取日志(在读取的情况下)或写入日志(在写入的情况下)。

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


编辑 #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


    【解决方案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)。谢谢你的回答:)
    • 我认为您应该重新考虑 AOP - 根据您的要求,这听起来像是一个不错的选择。 PostSharp 实际上做了您正在寻找的事情 - 它执行构建后操作,将建议直接注入 IL。
    • 问题是在编译时我仍然不知道我需要编织哪些类,所以我想推迟到它们被加载。据我了解,PostSharp 不可能做到这一点?如果我错了,请纠正我。
    • 见编辑#2。 [此处忽略此文本,我只需要达到 15 个字符长度]
    【解决方案2】:

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

    (来自上一个链接)

    生产环境中的分析 具有高可用性要求。 创建分析 API 是为了 支持开发时诊断。 它没有经过严格的 支持生产所需的测试 环境。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多