【问题标题】:Dynamic Method OpCodes.Stfld causing 'Operation could destabilize the runtime'动态方法 OpCodes.Stfld 导致“操作可能破坏运行时”
【发布时间】:2016-12-06 23:00:58
【问题描述】:

我正在尝试将 .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 会导致“操作可能破坏运行时”异常。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多