2016-11-29 15 views
0

Я хочу ввести один метод, используя Mono.Cecil.Метод ввода с использованием Mono.Cecil?

Мой код выглядит так:

var worker = method.Body.GetILProcessor(); 
method.Body.Instructions.Clear();//Clear Old code 

Я хочу, чтобы заменить код, как:

return getCpu(); 

Так я пишу:

List<Instruction> listStep = new List<Instruction>(); 
//listStep.Add(worker.Create(OpCodes.Nop)); 
//listStep.Add(worker.Create(OpCodes.Ldarg_0)); 
listStep.Add(worker.Create(OpCodes.Call,injectMethod)); 
//listStep.Add(worker.Create(OpCodes.Stloc_0)); 
//listStep.Add(worker.Create(OpCodes.Ldloc_0)); 
//listStep.Add(worker.Create(OpCodes.Br_S)); 
//listStep.Add(worker.Create(OpCodes.Stloc_1)); 
//listStep.Add(worker.Create(OpCodes.Ldloc_1)); 
listStep.Add(worker.Create(OpCodes.Ret)); 

foreach (var item in listStep) 
{ 
    worker.Append(item); 
} 

Но это не сработало.

Я в замешательстве с ИЛ. Кто-то может мне помочь? Большое спасибо.

+0

Как именно это не сработало? Что оно делает? Вы пытались запустить peverify на модифицированной сборке? – svick

ответ

0

Это зависит от оригинального метода, но, может быть, вам нужно добавить:

method.Body.Variables.Clear(); 
method.Body.ExceptionHandlers.Clear(); 

Кроме того, убедитесь, что injectMethod является допустимым методом.

Теперь, чтобы ввести метод, это должно работать:

worker.Emit(Opcodes.Call, injectMethod); 
worker.Emit(Opcodes.Ret); 

Обратите внимание, что вы испускают call и не callvirt, это нарочно? Потому что, если injectMethod не является статическим методом, in most cases вам нужно исправить callvirt.