2016-03-11 3 views
0

У меня проблемы при добавлении метода и заполнении его инструкциями. Я нашел необходимый тип, добавленный метод без проблем, но когда я добавляю вызов WriteLine, он не работает.Mono Cecil, метод и ввод инструкции

foreach (TypeDefinition type in assembly.MainModule.Types) 
     { 
      if (type.Name == "ClassB") 
      { 
       //TypeReference returntype = assembly.MainModule.Import(typeof(void)); 
       MethodDefinition met = new MethodDefinition("Test", 
        MethodAttributes.Private | MethodAttributes.Static, 
        assembly.MainModule.TypeSystem.Void); 
       type.Methods.Add(met); 

       ILProcessor worker = met.Body.GetILProcessor(); 
       Instruction msg = worker.Create(OpCodes.Ldstr, "Hello!"); 
       MethodReference writeline = assembly.MainModule.Import(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })); 
       met.Body.Instructions.Insert(0, msg); 
       met.Body.Instructions.Insert(1, Instruction.Create(OpCodes.Call, writeline)); 
      } 

Когда я декомпилирую код, я получаю // // ВЫБОР: не удается декомпилировать метод. в теле метода (я использую dotPeek). Добавление вызова к уже существующему методу в сборке работает отлично - оно видно и выполняется правильно. Во время работы он не создает никаких ошибок.

+0

Может быть, взглянуть на это [GitHub повторении] (https: // GitHub .com/markusschweitzer/ILRewriter) :) – Markus

ответ

1

Даже если ваш метод является недействительным, вы должны вставить OpCodes.Ret инструкцию только до конца своего метода, как это:

... 
met.Body.Instructions.Insert(0, msg); 
met.Body.Instructions.Insert(1, 
    Instruction.Create(OpCodes.Call, writeline)); 
met.Body.Instructions.Add(Instruction.Create(OpCodes.Ret)); 
+0

Действительно, эта одна строка заставляла работать. Огромное спасибо за помощь. – noctusnerdin

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