.net-core: эквивалент ILDASM/ILASM

Есть ли эквивалент ILDASM/ILASM для .net-core?

В частности, я ищу что-то, что работает в Linux (отсюда и .net-core).


person Doug    schedule 11.10.2016    source источник


Ответы (4)


Инструменты ildasm и ilasm созданы с помощью CoreCLR из этого репозитория: https://github.com/dotnet/coreclr. Они включают те же функции, что и версии, поставляемые с Windows (без графического интерфейса и т. д.).

Поставляются пакеты nuget, которые также включают их (https://www.nuget.org/packages?q=ildasm), но они зависят от платформы, а также требуют соответствующей версии CoreCLR для использования, поэтому их не так просто использовать с помощью nuget. Самый простой способ запустить их на вашей платформе — просто собрать их из исходного кода из репозитория coreclr.

person Eric Mellino    schedule 18.10.2016
comment
Это гораздо лучший ответ, чем мой. Спасибо за публикацию. Я не уверен, как я пропустил coreCLR, который может решить некоторые проблемы. - person Doug; 19.10.2016
comment
Есть ли уже скомпилированная версия этих инструментов или мне нужно создать репозиторий, чтобы получить их? - person Javier Holguera; 27.10.2016
comment
@JavierHolguera, как я уже упоминал выше, вы можете загрузить и использовать их из пакетов nuget, но вам нужно будет загрузить правильный отдельный пакет nuget для вашей операционной системы. - person Eric Mellino; 02.11.2016

Не похоже, что есть собственный инструмент Microsoft, который выполняет эти функции в Linux, и в настоящее время он не встроен в dot-net-core.

Однако Mono позволяет выполнять сборку и разборку IL-кода:

Инструкции по установке можно найти здесь.

То, что вы ищете, это:

ilasm - For assembling
monodis - For disassembling

Они находятся в пакете mono-utils:

например В Debian 8 я сделал следующее:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/debian jessie" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update
apt-get install mono-devel mono-utils

Однако, к вашему сведению, для тех, кто пытается создать экспорт, Mono, похоже, не обрабатывает синтаксис экспорта x64.

person Doug    schedule 11.10.2016
comment
Стоит отметить, что ikdasm лучше подходит для разборки, чем monodis. - person Vladimir Panteleev; 29.11.2016

Давайте «установим» инструмент ildasm, используя соответствующий пакет nuget:

  • определить RID (идентификатор среды выполнения)
dotnet --info

# execution result
..
Runtime Environment:
 OS Name:     ubuntu
 OS Version:  18.04
 OS Platform: Linux
 RID:         ubuntu.18.04-x64 # <----
..
  • загрузите пакет runtime.{RID}.Microsoft.NETCore.ILDAsm. В моем случае это: runtime.ubuntu.18.04 -x64.Microsoft.NETCore.ILDAsm
  • разархивируйте его и извлеките исполняемый файл '/runtimes/{RID}/native/ildasm'
  • предоставьте ему разрешение на выполнение и скопируйте в папку среды выполнения .NET (вызовите dotnet --list-runtimes, чтобы получить список сред выполнения)
chmod +x ildasm
sudo mv ildasm /usr/share/dotnet/shared/Microsoft.NETCore.App/{version}/
  • создать символическую ссылку
ln -s /usr/share/dotnet/shared/Microsoft.NETCore.App/{version}/ildasm ildasm
  • беги ильдасм
./ildasm {path}/project.dll >> {path}/project.il

Те же шаги применимы для ilasm. .


В качестве альтернативного способа рассмотрите возможность использования инструмента dotnet-ildasm:

# install .net core runtime if required
# sudo apt-get update; \
#   sudo apt-get install -y apt-transport-https && \
#   sudo apt-get update && \
#   sudo apt-get install -y dotnet-runtime-3.0

# find required tool
dotnet tool search ildasm
# output:
# Package ID         Latest Version      Authors      Downloads      Verified
# ---------------------------------------------------------------------------
# dotnet-ildasm      0.12.2              pjbgf        100154                 
# dotasm             1.0.1               DotAsm       434 

# install tool
dotnet tool install -g dotnet-ildasm

Вывод IL в файл:

# go to project folder
cd ../project/bin/Debug/netx.x

dotnet ildasm program.dll -o program.il
person vladimir    schedule 26.12.2020
comment
Эти шаги работают очень хорошо, но следует отметить, что вам не нужно размещать исполняемый файл в том же месте, что и установленный SDK. Это собственный исполняемый файл, который не зависит от среды выполнения или библиотек .Net, поэтому вы можете хранить его где угодно. - person RubberDuck; 13.02.2021

Это не полная замена инструментов, упомянутых в других ответах, но этот фрагмент F # позволил мне быстро найти подходящий тип и имя функции, которые мне нужны для AWS Lambda:

open System.Reflection

[<EntryPoint>]
let main argv =
  let asm =
    argv
    |> Array.tryHead
    |> Option.map Assembly.LoadFrom
    |> Option.defaultWith (Assembly.GetExecutingAssembly)

  printfn "%s" asm.FullName

  for t in asm.GetTypes () do
    printfn " * %s" t.FullName

  0

person sdgfsdh    schedule 27.01.2020