2016-08-01 20 views
0

Ich versuche, ein .Net 3.5-Projekt zu .Net 4.5 zu aktualisieren, funktioniert alles, aber eine DynamicMethod verursacht eine 'Operation könnte die Laufzeit' Ausnahme destabilisierenDynamische Methode OpCodes.Stfld verursacht 'Operation könnte die Laufzeit destabilisieren'

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>)); 
} 

die Telefonvorwahl

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

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

dataProviderAdapter.GetGuid (Werte, Index) gibt einen System.Guid wie erwartet, aber Aufruf fieldSetter verursacht die Ausnahme 'Operation die Laufzeit destabilisieren könnten.'

Ich habe keine Erfahrung mit IL, also bin ich wirklich nicht sicher, wo ich das Debuggen starten soll. PEVerify gibt keine Fehler zurück. Jede Hilfe würde sehr geschätzt werden.

Antwort

0

Wenn Ihr Feld nicht öffentlich sein kann, müssen Sie eine andere Überladung des DynamicMethod-Konstruktors verwenden, um skipvisibilitycheck anzugeben.