У меня есть ByteCode в сборке.Я хочу скопировать этот код в другую сборку.Это было нелегко, но на первый взгляд я получаю хороший экземпляр.Я могу скопировать пространства имен, классы, пользовательские атрибуты, поля и так далее.Но у меня есть проблема с методом Bodys.
Я знаю, что могу получить код с помощью:
byte[] ilCode = method.GetMethodBody().GetILAsByteArray();
Кроме того, я знаю, как установить новый метод Body:
MethodBuilder methodBuilder = typeBuilder.DefineMethod(method.Name, method.Attributes, method.CallingConvention, method.ReturnType, param.ToArray());
methodBuilder.SetMethodBody(ilCode, method.GetMethodBody().MaxStackSize, sig.GetSignature(), exce, null);
Переменные определены следующим образом:
- method: MethodInfo // оригинальный метод
- param: List // Список типов параметров
- exec: List // Список всех исключений
- sig: SignatureHelper // не совсем уверен, но что-то с местными жителями
Теперь у меня есть следующий результат:
Сначала оригинальный метод:
.method private hidebysig instance void onTargetFloorReached() cil managed
{
// Code size 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr "TargetFloorReached"
IL_0006: call instance void ['Assembly-CSharp']BaseWeb::CallFunctionWithParameter(string)
IL_000b: ret
} // end of method Lift::onTargetFloorReached
А теперь, что я получаю с другой стороны:
.method private hidebysig instance void onTargetFloorReached() cil managed
{
// Code size 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
INVALID TOKEN: 0x70000001
IL_0006: call [ERROR: INVALID TOKEN 0x0A00000D]
IL_000b: ret
} // end of method Lift::onTargetFloorReached
Я попытался загрузить каждую зависимость оригинальной библиотеки DLL, но это ничего не изменит.
Метод SetMethodBody определен как:
public void SetMethodBody (byte[] il, int maxStack, byte[] localSignature, System.Collections.Generic.IEnumerable<System.Reflection.Emit.ExceptionHandler> exceptionHandlers, System.Collections.Generic.IEnumerable<int> tokenFixups);
Нет информации о «tokenFixups».
Что это за исправления?Как я могу получить их?Или ошибка может быть где-то еще?
Редактировать: Кажется, что только вызовы функций недопустимы.Если бы я мог определить функцию по ее байтному представлению, я мог бы это исправить.