Вызов метода, который был только что создан. Ошибка расчета максимального значения стека
Поэтому я недавно дурачился с DNLIB и пытался добавить методы в файл.net. Я получил методы из ранее скомпилированного файла, поэтому я пытался имитировать метод.
Есть 3 метода: GetTheTypes, InvokeIt и InvokeCall.
Во-первых, мне пришлось создать методы GetTheTypes и InvokeIt, потому что InvokeCall вызывает как метод GetTheTypes, так и метод InvokeIt. Поэтому я добавил эти методы, и они были добавлены идеально. Он скомпилирован и сохранен, и я смог без проблем увидеть их в отражателе / ILSpy. Примечание: когда я добавляю методы, я проверяю, должны ли они быть статическими или нестатическими, так что это не проблема. Они также все публичные методы.
Затем я хотел добавить метод InvokeCall. Таким образом, я сделал то же самое, что и для других методов, открыл методы, которые я хотел имитировать в ILSpy, а затем скопировал все инструкции и локальные переменные в новый CilBody, который был добавлен в метод InvokeCall, который я имитировал. Единственная проблема заключалась в том, что он выдавал ошибку "Ошибка вычисления максимального значения стека". Странно было то, что если я изменил OPCode с Call на NewObj, он скомпилировался нормально. Но это не то, что я хочу сделать. То, что я хочу сделать, выдает ошибку, упомянутую выше.
Вот код, который я использую для добавления инструкции:
cBody.Instructions.Add(OpCodes.Call.ToInstruction(_getTheTypesMethod))
Переменная _getThetypesMethod определяется как MethodDefUser и состоит из метода, который я создал более простым и скомпилирован просто отлично. Я также попробовал это:
cBody.Instructions.Add(OpCodes.Call.ToInstruction(t.Asm.Import(_getTheTypesMethod)))
Это также не сработало. Я также попытался получить DeclaringType метода, а затем найти метод следующим образом:
cBody.Instructions.Add(OpCodes.Call.ToInstruction(t.Asm.Import(_getTheTypesMethod.GetDeclaringType().FindMethod("GetTheTypes")))
Это тоже не сработало.
Поэтому, если у кого-то есть какие-либо предложения относительно того, как вызвать только что созданный метод, скажите, пожалуйста. Я пытался выяснить, как решить эту проблему за последний день или около того, без преобладания. Благодарю.
1 ответ
Ответ был мой MethodSig был неправильным. Я ссылался на статический метод с экземпляром MethodSig. У меня была только проверка при создании метода для атрибутов метода, а не атрибутов создания.