none
MSIL: не могу найти ошибку в программе RRS feed

  • Общие обсуждения

  • Программа состоит из двух частей. Первая часть на C#, ее (с незначительными упрощениями) можно увидеть ниже. Вторая часть сгенерирована автоматически, ниже приведена ее "расшифровка" Рефлектором. 

    Что должно происходить: Program.Main вызывает метод a.X(10), который реализуется в классе ProxyClass, написанном на IL. Этот метод вызывает метод handle класса Proxy, который возвращает упакованное число 5. Далее метод ProxyClass.Protected.A.X распаковывает это число и возвращает его в метод Program.Main, который выводит его на консоль.

    Что происходит: на консоль выводится число 19439772.

    Что я сделал неправильно? 

    using System.Reflection;
    
    namespace Protected
    {
      class Program
      {
        static void Main(string[] args)
        {
          try
          {
            A a = new ProxyClass();
            Console.WriteLine(a.X(10));
          }
          catch (Exception e)
          {
            Console.WriteLine(e);
          }
        }
      }
    
      public class Proxy
      {
        protected object handle(MethodInfo method, object[] args)
        {
          return 5;
        }
      }
    
      public interface A
      {
        int X(int x);
      }
    }
    
    
    .namespace Protected
    {
    
    .class public auto ansi sealed ProxyClass
      extends [Protected]Protected.Proxy
      implements [Protected]Protected.A
    {
      .method public specialname rtspecialname instance void .ctor() cil managed
      {
        .maxstack 2
        L_0000: ldarg.0 
        L_0001: call instance void [Protected]Protected.Proxy::.ctor()
        L_0006: ret 
      }
    
      .method private virtual instance int32 Protected.A.X(int32) cil managed
      {
        .override [Protected]Protected.A::X
        .maxstack 6
        L_0000: ldarg.0 
        L_0001: call class [mscorlib]System.Reflection.MethodBase [mscorlib]System.Reflection.MethodBase::GetCurrentMethod()
        L_0006: castclass [mscorlib]System.Reflection.MethodInfo
        L_000b: ldc.i4.1 
        L_000c: newarr object
        L_0011: dup 
        L_0012: ldc.i4.0 
        L_0013: ldarg.1 
        L_0014: box int32
        L_0019: stelem.ref 
        L_001a: call instance object [Protected]Protected.Proxy::handle(class [mscorlib]System.Reflection.MethodInfo, object[])
        L_001f: unbox int32
        L_0024: ret 
      }
    
    }
    
    }
    
    1 января 2011 г. 16:41

Все ответы

  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]
    10 января 2011 г. 21:32