Использует this solution для преобразования анонимных типов в словари с помощью reflection.emit. Работал нормально, пока не перешел на .Net 4.0 с 3.5.Код DynamicMethod unverifiable в .Net 4.0 (найдено ref 'this' pointer ... expected ref '<> f__AnonymousType1`)
Теперь я получаю «System.Security.VerificationException: операция может дестабилизировать время выполнения». ошибка.
Преобразовал анонимно загруженный динамический метод в один размещенный в динамической сборке, сохранил его, а затем запустил peverify.exe, чтобы узнать, что случилось.
Got: [IL]: Ошибка: [DynamicAssemblyExample.dll: MyDynamicType :: MyMethod] [офф и др 0x0000000D] [найдено ссылок ('это' PTR) 'MyDynamicType'] [ожидается ссылка '<> f__AnonymousType1`3 [System.String, System.Int32, System.Byte] '] Неожиданный тип на stac k. [IL]: Ошибка: [DynamicAssemblyExample.dll: MyDynamicType :: MyMethod] [offs et 0x0000000D] Метод не отображается. 2 Ошибка (ы) Проверка DynamicAssemblyExample.dll
Код:
foreach (PropertyInfo property in itemType.GetProperties(attributes).Where(info => info.CanRead))
{
// load Dictionary (prepare for call later)
methIL.Emit(OpCodes.Ldloc_0);
// load key, i.e. name of the property
methIL.Emit(OpCodes.Ldstr, property.Name);
// load value of property to stack
methIL.Emit(OpCodes.Ldarg_0);
methIL.EmitCall(OpCodes.Callvirt, property.GetGetMethod(), null);
// perform boxing if necessary
if (property.PropertyType.IsValueType)
{
methIL.Emit(OpCodes.Box, property.PropertyType);
}
// stack at this point
// 1. string or null (value)
// 2. string (key)
// 3. dictionary
// ready to call dict.Add(key, value)
methIL.EmitCall(OpCodes.Callvirt, addMethod, null);
}
Есть ли способ, чтобы derefence указатель фактического имущества? Или мне нужно каким-то образом это сделать? Любые указатели?
С уважением!
Да, я сделал тест, где я сделал это без отражения, он выглядел почти так же, за исключением кода операции castclass ... который дает мне представление. – user365004
Yaay, проблема решена. Я просто должен был дать аргумент, и он работает. .Net 3.5 runtime verifier имеет некоторые отверстия, очевидно. Спасибо за ответ. – user365004