谁能告诉我这里的 IL 代码有什么问题?
IL_0000: nop
IL_0001: ldarg.1
IL_0002: isinst MyXmlWriter
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: ldarg.2
IL_000a: ldind.ref
IL_000b: unbox.any TestEnum
IL_0010: ldfld Int64 value__/FastSerializer.TestEnum
IL_0015: callvirt Void WriteValue(Int64)/System.Xml.XmlWriter
IL_001a: nop
IL_001b: ret
我在这里要疯了,因为我已经编写了一个测试应用程序,它执行与上述相同的操作,但是在 C# 和反射器中,其中的 IL 代码看起来就像我上面的 DynamicMethod 的 IL 代码(除了我的测试 C# 应用程序使用具有公共字段而不是上面枚举中的私有值字段的 TestStruct,但我已将 skipVisibility 设置为 true)...
我得到一个 NullReferenceException。
我的 DynamicMethod 的签名是:
public delegate void DynamicWrite(IMyXmlWriter writer, ref object value, MyContract contract);
我生成这样的方法:
List<Type> parameterTypes = new List<Type> {
typeof(DMBuilder),
typeof(IDynamicSerializationWriter),
typeof(object).MakeByRefType(),
typeof(MyContract)
};
DynamicMethod dm = new DynamicMethod(string.Format(
"Write_{0}",
contract.TypeName),
typeof(void),
parameterTypes.ToArray(),
typeof(DMBuilder),
true
);
var d = dm.CreateDelegate(typeof(DynamicWrite), this);
d(x,y);
而且我绝对不会传递任何空值。
提前致谢!