2015-07-06 3 views
0

Как изменить твердое значение целевой программы, которую я модифицирую? Код, который я хочу изменить, является частью массивной сети if. Это специальный раздел, я смотрю на:Изменение жестко закодированного значения

if (this.armor[l].type == 665) 
{ 
    this.maxTime = 150; 
} 

Я хочу изменить его так, чтобы this.maxTime = int.MaxValue. Как это сделать? И, если это невозможно, смогу ли я настроить таргетинг на блок if и изменить его? Или я могу добавить какой-то код в конец метода, чтобы делать то, что хочу?

ответ

0

Значение хранится в поле Operand класса Mono.Cecil.Cil.Instruction. Короткий вариант заключается в том, что для его изменения требуется только присвоение этого свойства и сохранение сборки.

Длинная версия состоит в том, что инструкция, скорее всего, является OpCodes.Ldc_I4_S, которая берет только sbyte для Operand (от -128 до 127), поэтому изменение его на int.MaxValue (2147483647) не будет работать. Если это один раз, вы также можете изменить Opcode на OpCodes.Ldc_I4, тогда вам должно быть хорошо идти.

Если вы делаете много изменений, то в Mono.Cecil.Rocks.dll есть несколько полезных методов расширения: MethodBody.SimplifyMacros и MethodBody.OptimizeMacros. Simplify превратит инструкции короткой формы в их длинную форму, а Optimize сделает обратное. Поверхность этого заключается в том, что вы можете выполнять поиск/переписывать свою сборку с помощью набора сокращенных инструкций и безопасно работать с инструкциями с короткими формами с ограниченным набором аргументов. В этом случае вы должны позвонить SimplifyMacros, установить Operand в нужное вам значение, а затем позвонить OptimizeMacro s, чтобы перейти в соответствующую форму.

Инструмент, такой как ILSpy, который позволит вам взглянуть на оригинальные и измененные сборки, неоценим при проверке вашей работы.

0

я заменил команду с другим, обозначающим значением я хотел

Оригинала: IL_4361: ldc.i4 150

Нового: IL_4361: ldc.i4 2147483647

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

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