7

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

4

5 回答 5

3

大概。这取决于。

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

http://mono-project.com/Cecil

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

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

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

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

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

于 2010-02-21T02:25:50.910 回答
2

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

于 2011-06-22T06:38:10.690 回答
1

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

于 2010-02-18T23:01:50.410 回答
0

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

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

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

于 2010-02-18T22:53:50.030 回答
-1

我假设你想这样做是因为你想看看什么需要时间,这样你就可以让它更快(而不是仅仅获得各种时间信息)。恕我直言,您不需要分析 API,如果您可以在 IDE 下运行您的应用程序并随机暂停它。这就是为什么。

于 2010-02-18T14:06:01.320 回答