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