【发布时间】:2015-01-11 13:35:31
【问题描述】:
我注意到某些类型的方法(例如泛型类型中的方法)中的字段或方法引用将是FieldReference 类型,而不是FieldDefinition,尽管字段(或方法)是相同的模块,同类型。我怎样才能从这个FieldReference 获得FieldDefinition?
我尝试了module.Import 和module.MetadataResolver.Resolve,但都不起作用。
对this 问题的跟进,但更一般。
编辑:
一个简单的泛型类:
public class HelperClass<T>
{
private int _someInt;
void SomeMethod(int i)
{
_someInt = i;
}
}
SomeMethod 的正文包含:
...
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000a: stfdl System.Int32 HelperClass`1<T>::_someInt
....
IL_000a 操作码的操作数通常应该是FieldDefinition,毕竟它在同一个模块中。但是因为我想HelperClass 是通用的,所以操作数是无法解析的FieldReference,我只能希望比较全名以实际找到FieldDefinition。
在这种情况下,这不是什么大问题,但是当引用是对其他泛型类型中的其他成员时,我确信有比枚举所有类型以找到定义更好的方法.
编辑:
HelperClass<> 来自AssemblyDefinition.ReadAssembly 在运行时加载的模块,此时.Resolve() 返回null 而不是返回FieldDefinition。
更新:
事实证明,因为我正在更改泛型类型中的字段名称,所以引用中断,Resolve() 返回 null。仍在为this one 寻找合适的解决方案。
【问题讨论】:
-
在引用上调用 Resolve() 不起作用吗? (即
var myFieldDefinition = myFieldReference.Resolve();) -
@rileywhite 不,返回空值。一开始我认为它应该是一个定义,但我认为对泛型类型成员的引用在 Cecil 中的处理方式不同。
-
您能发布重现您所见内容的代码吗?
-
@rileywhite 请查看编辑。
标签: c# .net mono.cecil