2010-07-05 1 views
1

Использует 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 указатель фактического имущества? Или мне нужно каким-то образом это сделать? Любые указатели?

С уважением!

ответ

0

Извините, ребята, сделали ошибку, так как фактический динамический метод создает тип делегата, который действует на экземпляр анонимного (или не анонимного) типа, код Ldarg_0 ищет нечто, чего нет в этом отладка.

Так что я, изменил его на OpCodes.Ldnull.

  var attributes = BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy; 
     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.Ldnull); 

      //methIL.Emit(OpCodes.Castclass, itemType); 
      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); 

     } 

Но я все еще получаю метод не видимой ошибки после его перевертывания. Получается, что методы обнаружения анонимных типов не видны через отражение?

0

Просто предложение, вы пытались переписать код, который испускает IL, чтобы фактически написать в словарь - т. Е. Нет Reflection.Emit? Моя ставка заключается в том, что сгенерированный ИЛ некорректен, а не код, который обращается к анонимному типу.

+0

Да, я сделал тест, где я сделал это без отражения, он выглядел почти так же, за исключением кода операции castclass ... который дает мне представление. – user365004

+0

Yaay, проблема решена. Я просто должен был дать аргумент, и он работает. .Net 3.5 runtime verifier имеет некоторые отверстия, очевидно. Спасибо за ответ. – user365004

 Смежные вопросы

  • Нет связанных вопросов^_^