public string Decompile(object @object) { if (@object == null) return String.Empty; Language l = new CSharpLanguage(); ITextOutput output = new RtfTextOutput(); var options = new DecompilationOptions(); if (@object is AssemblyDefinition) l.DecompileAssembly((AssemblyDefinition)@object, output, options); else if (@object is TypeDefinition) l.DecompileType((TypeDefinition)@object, output, options); else if (@object is MethodDefinition) l.DecompileMethod((MethodDefinition)@object, output, options); else if (@object is FieldDefinition) l.DecompileField((FieldDefinition)@object, output, options); else if (@object is PropertyDefinition) l.DecompileProperty((PropertyDefinition)@object, output, options); else if (@object is EventDefinition) l.DecompileEvent((EventDefinition)@object, output, options); else if (@object is AssemblyNameReference) { output.Write("// Assembly Reference "); output.WriteDefinition(@object.ToString(), null); output.WriteLine(); } else if(@object is ModuleReference) { output.Write("// Module Reference "); output.WriteDefinition(@object.ToString(), null); output.WriteLine(); } else { output.Write(String.Format("// {0} ", @object.GetType().Name)); output.WriteDefinition(@object.ToString(), null); output.WriteLine(); } return output.ToString(); }
public static void Main (string[] args) { string appPath = null; string slnName = null; string libPath = null; string expOpt = null; string outLanguageType = LAN_TYPE_CSHARP; DecompilerSettings ds = new DecompilerSettings (); ds.AnonymousMethods = true; ds.AsyncAwait = true; ds.YieldReturn = true; string onlyDecomileClassName = null; List<string> onlyDecompilingFileNameList = new List<string> (); //parsing args foreach (string x in args) { if (x.StartsWith ("-")) { switch (x) { case "-n": case "-l": case "-t": case "-C": case "-D": expOpt = x; continue; default: if (x.StartsWith ("-")) { if (x.Length < 2) { Console.WriteLine (" Unexpected options " + x); showUsage (); return; } for (int i = 0; i < x.Length; i++) { if (!praseDecompileSetting (x [i], ds)) { Console.WriteLine (" Unexpected options " + x); showUsage (); return; } } continue; } break; } } else if (expOpt != null) { switch (expOpt) { case "-n": slnName = x; expOpt = null; break; case "-l": libPath = x; expOpt = null; break; case "-t": if (x != LAN_TYPE_CSHARP && x != LAN_TYPE_IL) { Console.WriteLine (" Unexpected Output language type: " + x); showUsage (); return; } outLanguageType = x; expOpt = null; break; case "-C": onlyDecomileClassName = x; expOpt = null; break; case "-D": onlyDecompilingFileNameList.Add (x); break; default: showUsage (); expOpt = null; return; } } else { if (appPath == null) { appPath = x; continue; } else { Console.WriteLine (" Unexpected options " + x); showUsage (); return; } } } if (appPath == null) { Console.WriteLine ("directory/to/all/your/dll missing"); showUsage (); return; } if (slnName == null && outLanguageType==LAN_TYPE_CSHARP) { Console.WriteLine ("Solution Name missing"); showUsage (); return; } Console.WriteLine ("Decompiling all dll in " + appPath); Console.WriteLine ("Please wait..."); DirectoryInfo di = new DirectoryInfo(appPath); appPath = di.FullName; FileInfo[] dllFileInfoList = di.GetFiles("*.dll"); FileInfo[] exeFileInfoList = di.GetFiles ("*.exe"); AssemblyList asmlist = new AssemblyList ("mylistname"); foreach (var dllfile in dllFileInfoList) { bool bDecompile = isDecompilingFile (dllfile.FullName, onlyDecompilingFileNameList); asmlist.OpenAssembly (dllfile.FullName,!bDecompile); } foreach (var dllfile in exeFileInfoList) { bool bDecompile = isDecompilingFile (dllfile.FullName, onlyDecompilingFileNameList); asmlist.OpenAssembly (dllfile.FullName,!bDecompile); } if (libPath != null) { di = new DirectoryInfo(libPath); libPath = di.FullName; dllFileInfoList = di.GetFiles("*.dll"); foreach (var dllfile in dllFileInfoList) { asmlist.OpenAssembly (dllfile.FullName,true); } } StringBuilder projSln = new StringBuilder (); projSln.Append ("Microsoft Visual Studio Solution File, Format Version 11.00\n# Visual Studio 2010\n"); StringBuilder globSec = new StringBuilder (); Guid slnProjGuid = Guid.NewGuid(); int num = 0; LoadedAssembly [] ls = asmlist.GetAssemblies (); var decompilationOptions = new DecompilationOptions (); decompilationOptions.FullDecompilation = true; decompilationOptions.assenmlyList = asmlist; decompilationOptions.DecompilerSettings = ds; decompilationOptions.IncludedClassName = onlyDecomileClassName; if(outLanguageType==LAN_TYPE_CSHARP) { foreach (LoadedAssembly asm in ls) { if (asm.IsAutoLoaded) continue; string projectPath = appPath + "/"+ asm.ShortName; if(!Directory.Exists(projectPath)) { Directory.CreateDirectory (projectPath); } string projectFileName = projectPath + "/" + asm.ShortName + ".csproj"; asm.ProjectGuid = Guid.NewGuid(); asm.ProjectFileName = projectFileName; } } foreach (LoadedAssembly asm in ls) { num++; Console.WriteLine(asm.FileName + " " + num+"/"+ls.Length); if (asm.IsAutoLoaded) continue; if(outLanguageType==LAN_TYPE_CSHARP) { var csharpLanguage = new CSharpLanguage (); var textOutput = new PlainTextOutput (); decompilationOptions.SaveAsProjectDirectory = appPath + "/"+ asm.ShortName; csharpLanguage.DecompileAssembly (asm, textOutput, decompilationOptions); File.WriteAllText (asm.ProjectFileName, textOutput.ToString ()); Guid createdProjGuid = asm.ProjectGuid; projSln.Append(" Project(\"{"); projSln.Append (slnProjGuid.ToString()); projSln.Append ("}\") = \""); projSln.Append (asm.ShortName); projSln.Append ("\", \""); projSln.Append (asm.ShortName+"/"+ asm.ShortName + ".csproj"); projSln.Append ("\", \"{"); projSln.Append (createdProjGuid.ToString()); projSln.Append ("}\"\n"); projSln.Append("EndProject\n"); globSec.Append (" {"+createdProjGuid.ToString()+"}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n"); globSec.Append (" {"+createdProjGuid.ToString()+"}.Debug|Any CPU.Build.0 = Debug|Any CPU\n"); globSec.Append (" {"+createdProjGuid.ToString()+"}.Release|Any CPU.ActiveCfg = Release|Any CPU\n"); globSec.Append (" {"+createdProjGuid.ToString()+"}.Release|Any CPU.Build.0 = Release|Any CPU\n"); } else { var ilLanguage = new ILLanguage(true); var textOutput = new PlainTextOutput (); ilLanguage.DecompileAssembly (asm, textOutput, decompilationOptions); string ilFileName = appPath + "/"+ asm.ShortName+".il"; File.WriteAllText(ilFileName,textOutput.ToString()); } } if (outLanguageType == LAN_TYPE_CSHARP) { projSln.Append ("Global\n"); projSln.Append ("GlobalSection(SolutionConfigurationPlatforms) = preSolution\n"); projSln.Append ("\t\t\t\tDebug|Any CPU = Debug|Any CPU\n"); projSln.Append ("\t\t\t\tRelease|Any CPU = Release|Any CPU\n"); projSln.Append ("EndGlobalSection\n"); projSln.Append ("GlobalSection(ProjectConfigurationPlatforms) = postSolution\n"); projSln.Append (globSec.ToString ()); projSln.Append ("EndGlobalSection\n"); projSln.Append ("GlobalSection(MonoDevelopProperties) = preSolution\n"); projSln.Append ("\nEndGlobalSection\n"); projSln.Append ("EndGlobal\n\t\t"); string slnFileName = appPath + "/" + slnName + ".sln"; File.WriteAllText (slnFileName, projSln.ToString ()); } }