почему мой ILSpy показывает другую версию кода?

#c# #.net

#c# #.net

Вопрос:

Я новичок в C # и .net, извините, если мой вопрос звучит глупо.

Я следую онлайн-руководству, в котором рассказывается, как распознавать скомпилированный код, ниже приведен снимок от инструктора: введите описание изображения здесь

И ниже приведен скриншот с моего компьютера: введите описание изображения здесь

Вы можете видеть, что мой — это чисто IL-код, и даже если я изменю настройку на C #: введите описание изображения здесь <Main>d_0 раздела больше нет, а код — это чисто C #-код. итак, как я могу переключиться на представление, чтобы я мог видеть «более продвинутый код C #», как у инструктора?

Комментарии:

1. Видите выпадающий список на панели инструментов с надписью «IL»? Измените это на «C #».

2. @Corey Спасибо за ваш ответ. Я действительно сделал это, но это все еще не работает, пожалуйста, обратитесь к моему отредактированному сообщению, в которое я только что добавил новый скриншот

Ответ №1:

Вы используете более современную версию ILSpy по сравнению с вашим инструктором. Ваша более современная версия может лучше преобразовать новые языковые возможности C # в более простой код на C #.

Например, более старые версии ILSpy не могли декомпилировать async методы с await ключевыми словами обратно в методы с одним исходным кодом, но вместо этого показывали бы их как скомпилированные многометодные конечные машины (как вы видите, как TaskAwaiter показано в <Main>d_0 ).

Если вам нужен тот же дисплей, что и у вашего инструктора, вам нужно использовать ту же версию ILSpy, что и у них. На скриншоте видно, что они используют версию ILSpy 4 или более раннюю, которая к настоящему времени очень устарела. Вы должны сказать своему инструктору, чтобы он получил последнюю версию (по состоянию на ноябрь 2020 года это версия 6.1).

Комментарии:

1. Я подозреваю, что вы также могли бы сократить версию из C# 8.0 . Это может ограничить языковые шаблоны, которые ILSpy попытается использовать.

2. OP может отключить «Декомпилировать асинхронные методы», чтобы получить тот же вид.

Ответ №2:

На панели инструментов ILSpy есть группа кнопок, которые позволяют выбирать между

  • Показывать только общедоступные типы и члены
  • Показывать общедоступные, частные и внутренние (по умолчанию)
  • Показать все типы и члены (включая созданные компилятором)

Если вы выберете «Показать все типы и члены», вы увидите класс, созданный компилятором, и его метод MoveNext, даже если декомпиляция async функции включена.