Как запустить ildasm на .Net core exe / assembly?

Я пытаюсь запустить ildasm (Intermediate Language Disassembler), установленный как часть Visual Studio 2019, против консольного приложения .NetCore3.1.

Используйте командную строку разработчика Visual Studio 2019 и выполните следующую команду

ildasm.exe D: \ DotNet \ IntroductionToCsharp \ IntroductionToCsharp \ bin \ Debug \ netcoreapp3.1 \ IntroductionToCsharp \ bin \ Debug \ netcoreapp3.1 \ IntroductionToCsharp.exe

Но возникает следующая ошибка:

'D: \ DotNet \ IntroductionToCsharp \ IntroductionToCsharp \ bin \ Debug \ netcoreapp3.1 \ IntroductionToCsharp.exe' не имеет допустимого заголовка CLR и не может быть разобран

содержимое этой папки

Примечание: выполнение той же команды на exe-файле, отличном от Core (.Net Framework 4.x), работает нормально. Может, есть что-то особенное, чтобы посмотреть на IL в .Net Core?


person pune    schedule 20.01.2020    source источник
comment
Вы забыли добавить расширение .dll?   -  person Athanasios Kataras    schedule 20.01.2020
comment
Я добавляю расширение .exe, но все еще не запускаю   -  person pune    schedule 20.01.2020
comment
Приложения .NETCore построены по-другому, файл .exe - это host. Ваш код был скомпилирован в .dll, которую вы можете разобрать.   -  person Hans Passant    schedule 05.03.2020
comment
Или, попросту говоря, этот файл .exe эквивалентен dotnet.exe, поэтому он является собственным исполняемым файлом, а не сборкой .NET.   -  person Lex Li    schedule 08.03.2020


Ответы (3)


Как уже отмечалось, .exe в .NET Core - это не что иное, как хост. Его единственная цель - загрузить CoreCLR, затем выполнить JIT-компиляцию и выполнить метод Main вашей сборки. Сам код хранится в .dll. Вы можете проверить это с помощью своего любимого дизассемблера (ILDASM, dotPeek JetBrains, ILSpy и т. Д.).

Почему дизассемблер IL может работать против .exe в .NET Framework? Поскольку исполняемый файл будет управляемой сборкой с соответствующим управляемым заголовком. В отличие от .NET Core, .NET Framework имеет обширную поддержку со стороны загрузчика образов операционной системы Windows, позволяющую настроить все и затем запустить управляемый код в исполняемом файле. См. Второй обсуждаемый пункт здесь.

person Mihai Albert    schedule 08.03.2020

ПРИМЕЧАНИЕ. EXE в netcore существуют только для "пользователей Windows", вы всегда должны использовать dll.

См. здесь

Вы можете попробовать следующие шаги для сборки netcore (dll):

1 Вам необходимо иметь coreclr в той же папке, что и ваша dll netcore

2 (запускать команды в командной строке VS)

ildasm.exe /all /out:<path to output>.il <path to dll>.dll
person HLourenco    schedule 05.03.2020

Вы должны указать ildasm на свой файл сборки (.dll или .exe), а не на папку проекта, например.

ldasm.exe D:\DotNet\IntroductionToCsharp\IntroductionToCsharp\bin\Debug\netcoreapp3.1\IntroductionToCsharp.exe
person jalsh    schedule 20.01.2020
comment
Извините, я не понимаю, пожалуйста, прокомментируйте команду, которую вы говорите, спасибо - person pune; 20.01.2020
comment
D: \ DotNet \ IntroductionToCsharp \ IntroductionToCsharp \ bin \ Debug \ netcoreapp3.1 \ IntroductionToCsharp это путь, по которому у меня есть файл сборки. но по-прежнему возникает ошибка - person pune; 20.01.2020
comment
файл сборки не имеет расширения? вам, вероятно, просто нужно добавить расширение к вашей команде (.exe или .dll) - person jalsh; 20.01.2020
comment
Я предоставляю расширение .exe, но по-прежнему возникает ошибка, сэр, пожалуйста, предложите мне какое-то решение Спасибо - person pune; 20.01.2020
comment
вы можете показать содержимое папки и последнюю команду, которую вы пробовали? - person jalsh; 20.01.2020
comment
Сэр, пожалуйста, я загрузил ссылку на снимок экрана с содержимым папки, пожалуйста, посмотрите это фото и помогите мне - person pune; 20.01.2020
comment
и недавно я использую эту команду ›ildasm.exe D: \ DotNet \ IntroductionToCsharp \ IntroductionToCsharp \ bin \ Debug \ netcoreapp3.1 \ IntroductionToCsharp.exe - person pune; 20.01.2020