代码之家  ›  专栏  ›  技术社区  ›  plaureano

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

  •  7
  • plaureano  · 技术社区  · 15 年前

    我已经看了一些关于clr分析API的文章,其中许多文章讨论了调用setilFunctionBody()来进行实际的IL重写;但是,这些文章中没有一篇真正解释您可以使用什么来重写实际的方法IL字节。有没有一个非托管的库允许我写IL,或者我必须自己写一个?

    5 回复  |  直到 5 年前
        1
  •  3
  •   Scott Wisniewski    15 年前

    可能。这要看情况而定。

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

    http://mono-project.com/Cecil

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

    1. 使用工控机。您可以生成一个新的进程,在该进程中使用cecil进行重写,然后使用命名管道将字节传递回分析器。
    2. 塞西尔端口到C++。代码是在MIT/X11许可证下发布的,因此您可以在不共享更改的情况下进行此操作。
    3. 从头开始写你自己的东西。

    #1引入了一系列额外的复杂性。您的分析器最终将拥有比实际需要更多的移动部件。此外,IPC还引入了一系列额外的开销。

    #2需要很长时间。考虑到Cecil仍然只有0.6版,与编写自己的实现相比,也许不值得花时间来完成它。

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

        2
  •  2
  •   Shaun Wilde    13 年前

    我为OpenCover写了一个简单的 https://github.com/sawilde/opencover 你或其他人可能会觉得对你有用

        3
  •  1
  •   Fadrian Sudaman    15 年前

    这篇文章可能有你要找的东西 http://www.codeproject.com/KB/cs/IL_Rewriting.aspx

        4
  •  0
  •   S.Skov    15 年前

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

    一种更“常见”的技术是,用您喜欢的任何语言编写您需要的任何代码,然后将其编译为IL。然后,您可以在设计时提取操作码,并将它们存储在可以访问它们的地方,或者在运行时从编译的IL中提取它们,并在需要的地方进行填充。

    Afaik没有非托管库来帮助您完成这一任务。

        5
  •  -1
  •   Community pid    7 年前

    我假设你想这样做是因为你想知道什么是花时间,这样你可以使它更快(而不是仅仅得到各种时间信息)。 imho,如果你可以在一个IDE下运行你的应用并随机暂停它,你就不需要分析API了。 Here's why.