动态方法OpCodes.Stfld导致'操作可能会破坏运行时的稳定性。

时间:2016-08-01 18:50:53

标签: c# asp.net-mvc .net-4.5 dynamicmethod

我试图将.Net 3.5项目升级到.Net 4.5,一切正常,但是一个DynamicMethod导致“操作”会破坏运行时的稳定性。例外

public static FieldSetter<TField> CreateSetFieldDelegate<TField>(FieldInfo fieldInfo)
{
    var dynamicMethod = new DynamicMethod(
      "setfast_" + fieldInfo.Name,
      null,
      new[] { typeof(object), typeof(TField) },
      fieldInfo.DeclaringType);

    var ilGenerator = dynamicMethod.GetILGenerator();

    ilGenerator.Emit(OpCodes.Ldarg_0);
    ilGenerator.Emit(OpCodes.Ldarg_1);

    ilGenerator.Emit(OpCodes.Stfld, fieldInfo);
    ilGenerator.Emit(OpCodes.Ret);

    return (FieldSetter<TField>)dynamicMethod.CreateDelegate(typeof(FieldSetter<TField>));
}

主叫代码

var fieldSetter = Reflection.CreateSetFieldDelegate<Guid>(_fieldInfo);

        return (dataProviderAdapter, target, values, index)
          => fieldSetter(target, dataProviderAdapter.GetGuid(values, index));

dataProviderAdapter.GetGuid(values,index)按预期返回system.Guid,但是调用fieldSetter会导致&#39; Operation可能会破坏运行时的稳定性。异常。

我没有IL的经验,所以我真的不知道从哪里开始调试。 PEVerify不会返回任何错误。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您的字段可以不公开,则必须使用DynamicMethod构造函数的另一个重载来指定skipvisibilitycheck。