.net - 我是否需要编写自己的非托管 IL 库来使用 CLR Profiling API 重写 IL?

标签 .net profiling cil rewriting clr-profiling-api

我一直在查看有关 CLR Profiling API 的一些文章,其中许多文章都谈到调用 SetILFunctionBody() 来进行实际的 IL 重写;但是,这些文章都没有真正解释您可以使用什么来重写实际的 IL 字节方法。是否有一个非托管库允许我编写 IL,或者我必须自己编写一个?

最佳答案

大概。这取决于。

Mono 项目有一个名为 Cecil 的库,您可以在此处访问:

http://mono-project.com/Cecil

但是,它是托管代码,在分析时无法调用。不过,您可能有几个选择:

  • 使用工控机。您可以生成一个新进程,在该进程中使用 cecil 进行重写,然后使用命名管道将字节传回您的分析器。
  • 将 CECIL 移植到 C++。代码在 MIT/X11 许可下分发,因此您无需共享更改即可执行此操作。
  • 只需从头开始编写自己的东西。

  • #1 引入了一堆额外的复杂性。您的分析器最终会拥有比实际需要更多的事件部件。此外,IPC 引入了一堆额外的开销。

    #2 需要很长时间。鉴于 Cecil 仍然只有 0.6 版本,与编写自己的实现相比,可能不值得花时间去做。

    #3 会给你最大程度的控制,并且可能是最高效的。然而,这将比 #1 花费更多的努力。

    关于.net - 我是否需要编写自己的非托管 IL 库来使用 CLR Profiling API 重写 IL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2269844/

    相关文章:

    c# - dotTrace 在 PipelineRuntime.ProcessRequestNotification 中显示大量时间不明

    c# - 了解 C# 编译器如何处理链接 linq 方法

    .net - CLR 对 'throw' 做了什么?

    .net - 检测字符串

    c# - 委托(delegate)变量未被垃圾收集

    c# - SQL Server : cannot connect from local website (SQL Network Interfaces, 错误:26 - 定位指定的服务器/实例时出错)

    来自第二种形式的 C# 'callback'

    .net - 使用 VB.NET 连接到 MySQL

    java - 使用享元模式后,VisualVM 保留的大小相同

    c++ - 如何在 Linux 中使用 C++ 计时操作时处理缓存