2016-08-01 25 views
0

.Net 3.5プロジェクトを.Net 4.5にアップグレードしようとしていますが、すべて動作していますが、1つの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(値、指数)は予想通り可能System.Guidを返すが、呼び出しfieldSetterは例外 'オペレーションは、ランタイムを不安定可能性が' せます。

私はILの経験がありませんので、どこでデバッグを開始するのかは本当に分かりません。 PEVerifyはエラーを返しません。どんな助けでも大歓迎です。

答えて

0

フィールドがパブリックでない場合は、別のオーバーロードDynamicMethodコンストラクタを使用してskipvisibilitycheckを指定する必要があります。

関連する問題