Mono.Cecil заботится о местонахождении филиалов и т.д.? - PullRequest
10 голосов
/ 01 сентября 2011

Ну, этот вопрос может показаться странным, но он прост - я хочу сказать, есть ли у меня «goto» (brtrue и т. Д.) В декомпилированном коде, как в примере

br IL_0003
call *****
IL_0003: ret

и я добавляю команду после того, как **** вызовет br в верхней точке, чтобы повторить, как следует или к этому коду.

Сесил делает это сам, или я должен позаботиться обо всех этих ветвях? : / их было бы не очень сложно исправить, но если Сесил этого не сделает, я просто не запущу этот проект, у меня нет времени (или знаний) для продвинутой магии IL: P

(да, я знаю, что это не будет IL_0003, это просто для примера)

1 Ответ

16 голосов
/ 01 сентября 2011

Да, Сесил обновит ветку для вас.

Единственный случай, о котором вам нужно позаботиться, - это случай, когда ветвь является ветвью с короткой формой.Если вы введете слишком много инструкций, это может привести к переполнению.

Существует очень простой способ справиться с этим.Перед внедрением кода просто вызовите методы расширения SimplifyMacros из Mono.Cecil.Rocks, например:

method.Body.SimplifyMacros ();

Это превратит br.s в br.

А когда выКогда вы вводите код, просто наберите:

method.Body.OptimizeMacros ();

Это противоположная операция, то есть попытка превратить br в br.s, если это возможно.

...