将IL指令重构为更高级别的.net代码

时间:2015-07-17 12:03:54

标签: c# reflection decompiling mono.cecil ilspy

ILSpy正在使用cecil和它自己的库来完成这个,我听说.NETReflector正在使用他自己的私有算法从MSIL生成更高级别的c#,f#,vb代码,任何方法/引用如何做到这一点没有依赖?

编辑:我现在对ILSpy和塞西尔作为骨干感到满意

string GetSourceCode(string path) {
        var asmDef = AssemblyDefinition.ReadAssembly(path);
        var strBuilder = new StringBuilder();
        foreach (var type in asmDef.MainModule.Types) {
            if (!type.IsCompilerGenerated()) {
                AstBuilder builder = new AstBuilder(new DecompilerContext(asmDef.MainModule));
                builder.AddType(type);
                var output = new StringWriter();
                builder.GenerateCode(new PlainTextOutput(output));
                strBuilder.Append(output.ToString());
                output.Dispose();
            }
        }
        return strBuilder.ToString();
    }

1 个答案:

答案 0 :(得分:1)

嗯,首先要了解的是,在编译的dll或exe文件中没有普通的源代码。编译后,C#代码被编译为CIL。 Mono.Cecil将dll或exe文件作为字节数组读取,并将其解码为CIL指令。当.Net平台运行你的程序时,同样的事情。 ILSpy所做的是它试图根据解码的指令猜测源代码的外观。 .NETReflector做同样的事情,但没有使用Cecil