【问题标题】:.net-core: Equivalent of ILDASM / ILASM.net-core:相当于 ILDASM / ILASM
【发布时间】:2017-02-20 03:34:08
【问题描述】:

.net-core 有相当于 ILDASM / ILASM 的吗?

具体来说,我正在寻找在 Linux 上运行的东西(因此为什么要使用 .net-core)。

【问题讨论】:

    标签: linux .net-core ildasm ilasm


    【解决方案1】:

    ildasm 和 ilasm 工具都是使用来自此 repo 的 CoreCLR 构建的:https://github.com/dotnet/coreclr。它们包括与 Windows 附带的版本类似的功能(无 GUI 等)。

    发布的 nuget 包也包含它们 (https://www.nuget.org/packages?q=ildasm),但它们是特定于平台的,并且还需要使用匹配版本的 CoreCLR,因此它们不能直接通过 nuget 使用。在您的平台上运行它们的最简单方法是从 coreclr 存储库的源代码构建它们。

    【讨论】:

    • 这个答案比我的要好得多。谢谢你张贴这个。我不确定我是如何错过 coreCLR 的,这可能会解决一些问题。
    • 这些工具的版本是否已经编译,或者我是否需要构建存储库来获取它们?
    • @JavierHolguera,就像我上面提到的,您可以从 nuget 包下载和使用它们,但您需要为您的操作系统下载正确的单独 nuget 包。
    【解决方案2】:

    似乎没有在 Linux 上提供这些功能的本地 Microsoft 工具,而且它目前没有内置到 dot-net-core 中。

    然而,Mono 允许 IL 代码的汇编和反汇编:

    Installation Instructions can be found here.

    你要找的是:

    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 导出语法。

    【讨论】:

    【解决方案3】:

    让我们使用相关的 nuget-package 来“安装”ildasm 工具:

    • 定义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
    ./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
    

    【讨论】:

    • 这些步骤效果很好,但应该注意的是,您不需要将可执行文件与已安装的 SDK 放在同一位置。它是一个本机可执行文件,不依赖于 .Net 运行时或库,因此您可以将其保存在任何您喜欢的地方。
    【解决方案4】:

    这不是其他答案中提到的工具的完全替代品,但这个 F# sn-p 让我能够快速找到 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
    
    

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 2019-02-01
      • 2013-11-26
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      相关资源
      最近更新 更多