ILDASM 和 ILASM,如何使用它们?

Fre*_* L. 7 c# cil disassembly ildasm ilasm

我在尝试使用 Visual Studio 命令提示符(反)组装 dll 时遇到了困难,看起来不像我在 microsoft page 中看到的那么简单。

我正在以这些方式使用 ildasm:

ildasm myLibrary.dll output:MyLibrary.il
Run Code Online (Sandbox Code Playgroud)

我得到:无法打开“MyLibrary.il”进行输出。

我也试过完整路径:

ildasm directory\myLibrary.dll output:directory\MyLibrary.il
Run Code Online (Sandbox Code Playgroud)

我得到:指定的多个输入文件

使用 ildasm GUI 实际上有效,但是当我使用 ilasm 时:

ilasm myLibrary.il /dll
Run Code Online (Sandbox Code Playgroud)

我得到:无法打开 'myLibrary.il',当我使用完整路径时,我得到了同样的错误。

这里有什么问题?

Bar*_*r J 7

很简单,我们来看这行代码:

using System;      
public class sample  
{
    static void Main(string[] args)
    {
        Console.WriteLine("Inside main ...");
    }
}
Run Code Online (Sandbox Code Playgroud)

让我们编译App.csApp.exe. 这个可执行文件现在在我们运行它时打印 Inside main ...。

现在让我们尝试在不触及其源文件的情况下更改此可执行文件的输出。

您运行ildasm App.exe /out:App.il 以生成与可执行文件对应的 IL 代码。您现在可以在记事本中编辑此 il 代码,并将ldstr“Inside main ...”更改为“Inside main changed ...”,如下所示:

IL_0000:  nop
IL_0001:  ldstr      "Inside main ..."
IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
IL_000b:  nop
IL_000c:  ret
Run Code Online (Sandbox Code Playgroud)

IL_0000:  nop
IL_0001:  ldstr      "Inside main changed ..."
IL_0006:  call       void  [mscorlib]System.Console::WriteLine(string)
IL_000b:  nop
IL_000c:  ret
Run Code Online (Sandbox Code Playgroud)

现在让我们通过运行这个 il 文件来重建可执行文件。ilasm App.il.这会生成一个新的 App.exe。如果您运行 App.exe,您将获得以下输出“Inside main changed ...”

social.msdnc-sharpcorner 中有一些有用的帖子,也有指导如何使用 ILDASM 和 ILASM。

  • 这有点令人沮丧,我尝试了一个新项目,我得到:`c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools>ildasm ConsoleApp1.exe /out:ConsoleApp.il Unable to open 'ConsoleApp .il' 用于输出。` (2认同)