Как посмотреть IL код прямо в Visual Studio? C#

Видел как-то на скриншоте, у программиста было открыто окно с IL кодом прямо в visual studio, как он это сделал возможности спросить не было. Подскажите?

Использую Visual Studio 2019


Ответы (1 шт):

Автор решения: S.H.

Меня этот вопрос тоже заинтересовал, и я постарался поискать информацию. Нашел не сразу.

Благодаря замечанию vitidev к моему ответу - я знаю, что это, скорее всего, решарпер.

В нём эта функция включается через ReSharper -> Windows -> IL Viewer в меню решарпера.

На картинках 7 и 8 показано, как включить, и результат. Конечно, очень красивый - как ивсё у JetBrains.

В VS есть прекрасный "обычный дебаггер" - потому, что это общий дебаггер для всех типов проектов.

Его можно вызвать Debug > Windows > Dissasembly (Ctrl + Alt + D). Вызывается только в режиме отладки.

Он показывает "дизассемблнутый" машинный код, что, конечно же, не является MSIL-ом. Заметим, что есть особенность: MSIL при компиляции в машинный код обрабатыветя еще и JIT'ом, так что однозначного сооветствия между командой MSIL и группой команд ассемблера может не быть.

Как примерно выглядит - показано на картинке 1 в конце ответа.

Следующее, что приходит в голову - это ILDASM. Вызывается как отдельная программа, дизассемблирует сборки (*.dll и *.exe, по простому говоря), написанные на NET, в MSIL. Поскольку эта штука приходит вместе со студией, (или, возможно, вмесие с NET core SDK?) - то поддерживает все версии NET, от старенького NET Framework и до NET Core.

Не позволяет производить отладку, только показывает MSIL-код.

Показан на картинке 2.

Есть прекрасный - судя по отзывам - инструмент, который называется NET Reflector (производства Redgate). Интегрируется с VS. Вызывается прямо из VS. Платный. Но, судя по видео на их сайте, он осуществляет скорее "дизасеемблирование в исходный код" каких то чужих бинарников и отладку на уровне исходного кода. По моему, окна с MSIL там нет. Еслия ошибаюсь - может, кто то, кто с Reflector'ом работал - меня поправит?

Видео с демонстрацией работы - на этой их странице.

Мне очень понравился инструмент, котрый я уже упомянул в комментарии к вопросу - написанный Джозефом Албахари (да-да, тем самым, который написал "C#. Справочник. Полное описание языка") LinqPad. Помимо хороших возможностей по отладке LINQ и SQL запросов, там есть также (в профессиональной версии) трансляция в IL - код.

Видео про использование на ютьюбе

Картинка 3.

И последнее, что мне попалось -наверное, самое близкое к "отладке IL кода". Это проект венгерского программиста Zsolt Petrény под названием Dotnet IL Editor (DILE).

Эта штука позволяет отлаживать .NET 1.0/1.1/2.0/3.0/3.5/4.0 - сборки.

Я эту штуку взял из гитхаба и собрал (пришлось подправить буквально пару ссылок на DLL-ки в с++ - сной части проекта).

Она позволяет загружать и запускать сборки - с теми ограничениями на версию фремворка, которые я только что написал.

При этом есть особенность, которая отражена на картинке 4 в конце ответа - нужно после загрузки сборки в DILE назначить startup assembly.

Потом можно поставить breakpoint и по шагам отлаживать IL - код.

Процесс отладки простого кода (чуть ниже) показан на картинке 5.

Чего не хватает: я не нашел, как посмотреть память (дамп памяти). Самое близкое к этому - просмотр объектов, показанный на картинке 6.

Вообще, штука мощная, учитывая, что это отладчик с исходными кодами - то есть, теоратически, его можно попробовать улучшать под свои нужды.

Если у кого то есть еще идеи - буду рад, если Вы ими поделитесь в комментариях.

Код, котрый я запихивал в отладчик:

    using System;

    namespace DebMsil2 {
        class Program {

            struct Point {
                public int X, Y;
            }
            static void Main(string[] args) {
                Console.WriteLine("Press any key!");
                Console.ReadLine();
                
                Point p;
                p.X = 12;
                p.Y = 15;

                Console.WriteLine("x" + "y" + "z");
                Console.ReadLine();
            }
        }
    }

Картинка 1 (Windows debugger): Windows debugger

Картинка 2 (ILDASM): ILDASM

Картинка 3 (LINQPAD): LINQPAD

Картинка 4 (назначаем в DILE startup point): назначаем в DILE startup point

Картинка 5 (процесс отладки в DILE): процесс отладки в DILE

Картинка 6 (просмотр значений полей объекта): просмотр значений полей объекта

Картинка 7 (победитель - Решарпер, включаем показ IL кода): победитель - Решарпер, включаем показ IL кода

Картинка 8 (победитель - Решарпер, вот как он показывает IL код): победитель - Решарпер, вот как он показывает IL код

→ Ссылка