Size: a a a

2020 April 15

HJ

Happy Jupiter in .NET CIL Chat
Свергнем вместе кожаных ублюдков
источник
2020 April 18

G

Gradi in .NET CIL Chat
источник
2020 April 19

B

Bogdan in .NET CIL Chat
статью не читал, но я точно знаю что через хаки с ILAsm я мог сдеать метод котрый возарщает String но на само деле там другой объект, типо юзер

И его можно было успешно присвоить переменной.  при вызове методов стринга рантайм офигивал)
источник
2020 April 25

HJ

Happy Jupiter in .NET CIL Chat
три joined the group
источник
2020 May 20

D

Dark_Bull in .NET CIL Chat
Ну всё же, на крайняк
источник

D

Dark_Bull in .NET CIL Chat
Переслано от Dark_Bull
У меня есть пара вопросов. Буквально. Как я понял, нет варианта объявить метку в IL коде, не используя Define-MarkLabel();
Может кто рассказать, как работает MarkLabel? У кого-нибудь может годная статья есть на этот счёт? Интересно, как компилятор вставляет метку к условиям.
Например, вставляются в ILStream с инструкции из рода br...... минимум два байта(2-5, понятно, что в зависимости от условия)(с учетом того, что вставляется не голый br... опкод, не без операнда), последний равен 0x00. Даже после простановки метки он остается нулевым байтом.
Экспериментирую на примере от майков: https://docs.microsoft.com/ru-ru/dotnet/api/system.reflection.emit.ilgenerator.definelabel?view=netcore-3.1
И уже после return myTypeBldr.CreateType(); эти нулевые байты забиваются.
Я посмотрел сурсы, там жесть полная, может кому-то было интересно и смотрел под капот и вкратце сможет объяснить суть?
источник

D

Dark_Bull in .NET CIL Chat
Ну или я беру в одну руку отладчик, а во вторую библиотеку и иду копаться в рутине "счастья". Что я думаю, мне так и придется делать
источник

AK

Andrey Kurnoskin in .NET CIL Chat
Dark_Bull
Переслано от Dark_Bull
У меня есть пара вопросов. Буквально. Как я понял, нет варианта объявить метку в IL коде, не используя Define-MarkLabel();
Может кто рассказать, как работает MarkLabel? У кого-нибудь может годная статья есть на этот счёт? Интересно, как компилятор вставляет метку к условиям.
Например, вставляются в ILStream с инструкции из рода br...... минимум два байта(2-5, понятно, что в зависимости от условия)(с учетом того, что вставляется не голый br... опкод, не без операнда), последний равен 0x00. Даже после простановки метки он остается нулевым байтом.
Экспериментирую на примере от майков: https://docs.microsoft.com/ru-ru/dotnet/api/system.reflection.emit.ilgenerator.definelabel?view=netcore-3.1
И уже после return myTypeBldr.CreateType(); эти нулевые байты забиваются.
Я посмотрел сурсы, там жесть полная, может кому-то было интересно и смотрел под капот и вкратце сможет объяснить суть?
Не уверен, что я правильно понимаю вопрос, но метки-то в IL-коде не существует. Label в ILGenerator'е существует только до генерации IL, при которой место использования метки заменяется на оффсет инструкции. Соответственно, объявить метку в IL-коде де-факто вообще нельзя, а теоретически можно повторить машинерию Define/MarkLabel в своём коде. Но зачем?..
источник

D

Dark_Bull in .NET CIL Chat
Это я в курсе, что последний байт инструкции заменяется на нужный оффсет. Проблема в том, что я использую стороннюю библиотеку, которая(по-крайней мере у меня не получилось) не позволяет совместить ILGenerator и саму библиотеку. Но без ILGenerator'a я не смогу объявить Mark-DefineLabel(). Вот я и думаю, могу ли я собственноручно запихнуть в этот последний байт самостоятельно нужное смещение. Но если я пытаюсь так делать - успехом это не завершается.
источник

AK

Andrey Kurnoskin in .NET CIL Chat
Не вижу, почему это должно быть невозможно — логика, по которой ILGen заменяет Label на адреса, описана в нём в методе BakeByteArray и выглядит довольно прямолинейно
источник

AK

Andrey Kurnoskin in .NET CIL Chat
А что на деле происходит?
источник

D

Dark_Bull in .NET CIL Chat
Сейчас, еще кое-что в голову пришло, попробую
источник

AK

Andrei Kurosh in .NET CIL Chat
Думаю, что MarkLabel просто сохраняет текущий offset в теле метода в некую внутреннюю таблицу ILGenerator'а, а когда ты компилируешь метод - проходится по ней и все места, где ты этот label использовал, заменяет на этот оффсет
источник

D

Dark_Bull in .NET CIL Chat
Я не пойму, как реализовать этот операнд.
(000A).
источник

D

Dark_Bull in .NET CIL Chat
Если я пытаюсь использовать напрямую в качестве операнда байт(0x0A), получаю ошибку.
источник

D

Dark_Bull in .NET CIL Chat
Вот, что я пытаюсь "воссоздать"
источник

D

Dark_Bull in .NET CIL Chat
Не обращайте внимание на то, что ласт return никогда не выполнится, проблема не в этом
источник

AK

Andrey Kurnoskin in .NET CIL Chat
Так br*-опкоды не принимают в качестве операнда оффсет от начала метода. Они принимают оффсет от конца br*-инструкции.
источник

AK

Andrey Kurnoskin in .NET CIL Chat
Dark_Bull
Вот, что я пытаюсь "воссоздать"
Именно поэтому операндом brfalse.s здесь является 5, а не 000A
источник

D

Dark_Bull in .NET CIL Chat
Andrey Kurnoskin
Именно поэтому операндом brfalse.s здесь является 5, а не 000A
Информация полезная. Запомню, спасибо, но проблема осталась та же
источник