【问题标题】:How to tell from a CIL instruction whether a field is read or written to?如何从 CIL 指令中判断一个字段是被读取还是被写入?
【发布时间】:2010-12-29 17:53:09
【问题描述】:

我目前正在使用 Mono Cecil 从 C# 项目中提取数据。现在我需要检查每个方法中是否读取或写入了一个字段。

如何从CIL instruction 得知正在读取或写入字段?

因为我怀疑 Mono Cecil 中是否有类似于 Eclipse 的 JDT 中的Assignment 的库,它允许我提取左侧和右侧。如果有,那我就可以从那里工作了。

【问题讨论】:

  • 顺便说一句,我建议使用 ECMA 的这个 CLI 规范:google.com/url?q=http://www.ecma-international.org/publications/… - 而不是 MS 规范。后者有一些实现细节,但缺少可导航的目录,非常不方便。 ECMA 规范也是分区 I-III 的单个文件。
  • 其实我有 ECMA 规范,但我以为我只需要分区 III。所以我只是搜索一个带有分区 III 作为 url 的 url 来附加到这个 qn。你的意思是除了III之外我还需要其他分区的其他东西,我应该查看哪些其他分区?
  • 分区 III 是 CIL 指令集,但它大量引用分区 I 和 II(定义基本概念、CLR 类型系统等)。我之前提供的链接适用于所有 3 个分区。

标签: c# mono cil mono.cecil


【解决方案1】:

直接字段存储的说明是stfld,因此您必须注意这一点。

请注意,字段也可以通过指针(*& 类型)间接写入,这在最一般的情况下是不可能检测到的(因为指针可以来自外部)。

【讨论】:

  • “指针可以来自外部”是什么意思?你能举个例子吗,thx?我知道一点abt指针,但不熟悉。
  • 考虑 C# 代码:unsafe void Foo(int* p) { *p = 123; }。这可以称为Foo(&x.y)(例如,如果x 是本地struct)。
  • 我发现 ldfld 和 stfld 只适用于 getter 和 setter。对于其他读取和存储(指针除外),我认为您可以使用 ldsfld 和 stsfld 。当调用该方法时,我尝试了你给出的例子并得到了 ldflda。
  • 似乎 ldfld 和 stfld 用于非静态,而 ldsfld 和 stsfld 用于静态。我尝试使用非静态字段并看到了区别。谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多