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