2016-08-01 66 views
0

我正在嘗試將.NET 3.5項目升級到.Net 4.5,一切正常,但一個DynamicMethod導致'操作可能會破壞運行時'異常動態方法OpCodes.Stfld導致'操作可能會破壞運行時'

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(值,index)返回的System.Guid如預期,但調用fieldSetter引起 '操作可能會破壞運行時' 異常。

我對IL沒有任何經驗,所以我真的不知道從哪裏開始調試。 PEVerify不會返回任何錯誤。任何幫助將不勝感激。

回答

0

如果您的字段可能是非公開的,您必須使用DynamicMethod構造函數的另一重載來指定skipvisibilitycheck。

相關問題