【发布时间】:2025-12-27 13:40:06
【问题描述】:
使用 Mono.Cecil,给定这个方法
private Instruction LoadOnStack(MetadataType type, object value)
{
switch (type)
{
case MetadataType.String:
return _processor.Create(OpCodes.Ldstr, (string) value);
case MetadataType.Int32:
return _processor.Create(OpCodes.Ldc_I4, (Int32) value);
case MetadataType.Int64:
return _processor.Create(OpCodes.Ldc_I8, (Int64) value);
case MetadataType.Boolean:
return _processor.Create(OpCodes.Ldc_I4, (bool) value ? 1 : 0);
}
throw new NotSupportedException("Not a supported primitve parameter type: " + type);
}
当value 的类型为Type 时,如何创建可以加载value 的Instruction?
我注意到当value 是Type 类型时,我可以像这样对其进行测试:
if (value is TypeReference)
return _processor.Create(???, ???);
但我无法弄清楚我需要传递给Create 以获取正确加载的值。
编辑:
使用这个:
if (value is TypeReference)
return _processor.Create(OpCodes.Ldobj, type.Resolve());
让我更近一步。它似乎接受类型。但是当我尝试编写程序集时,它会出错:
System.ArgumentException : Member 'System.Type' is declared in another module and needs to be imported
【问题讨论】:
-
我不熟悉 il 可用的内容;反射是一种选择吗?您可以在
_processor中搜索Create方法,其第二个参数的类型为Type?或者,所有东西都可以装箱到一个对象...? -
您是否尝试将
Type类型的对象实例加载到堆栈中? -
@object88 在这种情况下,反射不是一个选项。而
OpCodes没有Type的条目。我试过OpCodes.Ldobj、OpCodes.Ldind_Ref和其他一些我不记得了 -
@cubrr 这是个好问题。我相信是的。它是来自
Attribute的命名命名参数,使用typeof运算符分配。 -
尝试首先使用您的类型发出
ldtoken,然后发出对Type.GetTypeFromHandle的调用
标签: c# il mono.cecil fody