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

时间:2010-02-16 00:11:50

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

我一直在查看CLR Profiling API的一些文章,其中许多文章都讨论了调用SetILFunctionBody()来进行实际的IL重写;但是,这些文章中没有一个实际上解释了您可以用来重写实际方法IL字节的确切内容。是否有一个非托管的库允许我写IL,或者我必须自己写一个?

5 个答案:

答案 0 :(得分:3)

可能。这取决于。

Mono Project有一个名为Cecil的库,你可以在这里访问:

http://mono-project.com/Cecil

然而,它是托管代码,在分析时无法调用。你可能有几个选择:

  1. 使用IPC。您可以生成一个新进程,在该进程中使用cecil进行重写,然后使用命名管道将字节传回给您的探查器。
  2. CECIL到C ++的端口。代码在MIT / X11许可下分发,因此您无需共享更改即可执行此操作。
  3. 从头开始写自己的东西。
  4. #1引入了一堆额外的复杂性。您的探查器最终会有比实际需要更多的移动部件。此外,IPC引入了一堆额外的开销。

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

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

答案 1 :(得分:2)

我为OpenCover https://github.com/sawilde/opencover写了一个简单的文件,您或其他任何人可能会发现这个问题很有用

答案 2 :(得分:1)

这篇文章可能有您想要的内容 http://www.codeproject.com/KB/cs/IL_Rewriting.aspx

答案 3 :(得分:0)

实际的字节必须来自某个地方,如果您只是使用Profiling API,那么您必须自己提供。本文深入探讨了如何做到这一点(可能是你读过的那篇之一):http://msdn.microsoft.com/en-us/magazine/cc188743.aspx

更“常见”的技术是以您喜欢的任何语言实际编写您需要的任何代码,然后将其编译为IL。然后,您可以在设计时提取OpCodes并将它们存储在可以访问它们的位置,或者在运行时从已编译的IL中提取它们并将其填充到您需要的位置。

AFAIK没有非托管库可以帮助您解决此问题。

答案 4 :(得分:-1)

我认为你想要这样做,因为你想看看花时间,以便你可以让它变得更快(而不是只是得到各种时间信息)。 恕我直言,如果您可以在IDE下运行您的应用程序并随机暂停,则不需要分析API。 Here's why.