Использовал это решение для преобразования анонимных типов в словари с помощью Reflection.emit. Работал нормально, пока я не перешел на .Net 4.0 с 3.5.
Теперь я получаю «System.Security.VerificationException: операция может дестабилизировать среду выполнения». ошибка.
Преобразовал анонимно загруженный динамический метод в метод, размещенный в динамической сборке, сохранил его, а затем запустил на нем peverify.exe, чтобы выяснить, что не так.
Получил: [IL]: Ошибка: [DynamicAssemblyExample.dll: MyDynamicType::MyMethod][offs et 0x0000000D][найдена ссылка ('this' ptr) 'MyDynamicType'][ожидаемая ссылка '‹>f__AnonymousType1`3[System.String, System.Int32,System.Byte]'] Неожиданный тип в стеке. [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);
}
Есть ли способ разыменовать указатель на фактическое свойство? Или надо как-то лить? Любые указатели?
С Уважением!