@SergeySerge11

Как скопировать метод IL кода?

Что за класс DynamicILInfo,, Он вообще работаете.
Почему не работает метод SetCode, сколько не пытаюсь пробить Какие-то сигнатуры не верны, что за сигнатуры,токены.
Это же очевидно Что Hello World пример класса должен быть пример Копирование метод а
И открыл больше 40000 вкладок, не нашел ни одного примера, Где работают непосредственно с байт кодом полученным от метода GetILAsByteArray()
public static void test_1()
    {
        var method = new DynamicMethod("Test", typeof(void), Type.EmptyTypes);
        var info = method.GetDynamicILInfo();
        info.SetLocalSignature(new byte[] { 0x7, 0x0 }); /// Это вообще что такое
        info.SetCode(new byte[] { 0x2a }, 1);  

        ((Action)method.CreateDelegate(typeof(Action)))();
    }
    public static void test_2()
    {
        var method = new DynamicMethod("Test", typeof(void), Type.EmptyTypes);
        var info = method.GetDynamicILInfo();
        var sig= SignatureHelper.GetLocalVarSigHelper().GetSignature();
        info.SetLocalSignature(sig); 
        var m =  typeof(Program).GetMethod("M");
        var b=m.GetMethodBody();
        info.SetCode(b.GetILAsByteArray(), b.MaxStackSize);
        ((Action)method.CreateDelegate(typeof(Action)))();
    }
    public static void M( ) {}
// А такой никогда в жизни не запустится
// ПОЧЕМУ,   в теле же метода все указано.
    public static void M( ) {
 //Console.WriteLine("HelloWorld"); 
}

Максимальное что можно скопировать, с пустым телом. Почему SetCode не работает, как наверное ожидает любой человек на земле?

Что за сигнатуры зачем нужны, Я знаю что это в байт коде, но не понимаю, Где это достать, какие-то токены, сигнатуры, А где их получить то?
И все примеры вот такие, Ну это же полная ерунда какая-то.

public void Init()
{
    byte[] buffer = new byte[] { 
        0x16, 10, 2, 2, 0x1f, 9, 0x25, 13, 0x7d, 100, 0, 0, 4, 9, 0x7d, 0x63, 
        0, 0, 4, 0x16, 11, 0x2b, 0x12, 2, 0x7b, 0x62, 0, 0, 4, 7, 0x91, 0x2d, 
        4, 6, 0x17, 0x58, 10, 7, 0x17, 0x58, 11, 7, 2, 0x7b, 0x62, 0, 0, 4, 
        0x8e, 0x69, 50, 0xe3, 2, 6, 0x8d, 0x3e, 0, 0, 1, 0x7d, 0x65, 0, 0, 4, 
        0x16, 10, 0x16, 12, 0x2b, 0x1b, 2, 0x7b, 0x62, 0, 0, 4, 8, 0x91, 0x2d, 13, 
        2, 0x7b, 0x65, 0, 0, 4, 6, 0x25, 0x17, 0x58, 10, 8, 0x9e, 8, 0x17, 0x58, 
        12, 8, 2, 0x7b, 0x62, 0, 0, 4, 0x8e, 0x69, 50, 0xda, 0x2a
     };
    Type[] arguments = new Type[] { typeof(int), typeof(int), typeof(int), typeof(int) };
    Type[] resTypes = new Type[] { 
        typeof(TheGame), typeof(TheGame), typeof(TheGame), typeof(TheGame), typeof(int), 
        typeof(TheGame), typeof(TheGame), typeof(TheGame), typeof(TheGame) 
    };
    string[] resVars = Transformer.Change(new string[] { 
        "+Nfs6fzp1+vn5P3l5g==", "+Nfs6fzp1/rn/w==", "+Nfs6fzp", "+Nfs6fzp", "web8u7o=", 
        "+Nfh5uzt8A==", "+Nfs6fzp", "+Nfh5uzt8A==", "+Nfs6fzp" 
    });
    Type[][] funParamTypes = new Type[][] { 
        new Type[0], new Type[0], new Type[0], new Type[0], new Type[0], 
        new Type[0], new Type[0], new Type[0], new Type[0] 
    };
    int[] index = new int[] { 9, 15, 0x19, 0x2c, 0x37, 60, 0x48, 0x52, 100 };
    int maxStackSize = 4;
    try
    {
        DynamicMethod method = new DynamicMethod("", typeof(void), new Type[] { typeof(TheGame) }, true);
        DynamicILInfo dynamicILInfo = method.GetDynamicILInfo();
        SignatureHelper localVarSigHelper = SignatureHelper.GetLocalVarSigHelper();
        localVarSigHelper.AddArguments(arguments, null, null);
        TokenResolver.Resolve(ref buffer, index, resTypes, resVars, funParamTypes, dynamicILInfo);
        dynamicILInfo.SetCode(buffer, maxStackSize);
        dynamicILInfo.SetLocalSignature(localVarSigHelper.GetSignature());
        InitD td = (InitD) method.CreateDelegate(typeof(InitD), this);
        td();
    }
    catch (Exception exception)
    {
        throw new GameProtectionException(exception.Message, exception);
    }
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ответы на вопрос 1
AleksejMsk
@AleksejMsk
Программирую от души за деньги
Любопытно.
А что за задача решается ?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы