private static void Main(string[] args) { // Console.WriteLine("Args: {0}", string.Join(", ", args)); // Console.Read(); // AttachConsoleWriter(); 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; bool dllPathOnTop = true; 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; case "-q": dllPathOnTop = false; continue; default: if (x.Length < 2) { Console.WriteLine(" Unexpected options " + x); showUsage(); return; } for (int i = 1; i < x.Length; i++) { if (!praseDecompileSetting(x[i], ds)) { Console.WriteLine(" Unexpected options " + x); showUsage(); return; } } continue; } } 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..."); // Extensions.WriteRead($"Path: {appPath}"); 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.AssemblyFileNameOnTop = dllPathOnTop; 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()); } }
public static void WriteObject(ITextOutput output, object obj, WriteObjectFlags flags = WriteObjectFlags.None) { if (IsNull(obj)) { output.Write("null", TextTokenType.Keyword); return; } var mr = obj as IMemberRef; if (mr != null) { if (ILLanguage.Write(output, mr)) { return; } } var local = obj as LocalVM; if (local != null) { output.Write(IdentifierEscaper.Escape(GetLocalName(local.Name, local.Index)), TextTokenType.Local); output.WriteSpace(); output.WriteLocalParameterIndex(local.Index); return; } var parameter = obj as Parameter; if (parameter != null) { if (parameter.IsHiddenThisParameter) { output.Write("this", TextTokenType.Keyword); } else { output.Write(IdentifierEscaper.Escape(GetParameterName(parameter.Name, parameter.Index)), TextTokenType.Parameter); output.WriteSpace(); output.WriteLocalParameterIndex(parameter.Index); } return; } var instr = obj as InstructionVM; if (instr != null) { if ((flags & WriteObjectFlags.ShortInstruction) != 0) { output.WriteShort(instr); } else { output.WriteLong(instr); } return; } var instrs = obj as IList <InstructionVM>; if (instrs != null) { output.Write(instrs); return; } var methodSig = obj as MethodSig; if (methodSig != null) { output.Write(methodSig); return; } if (obj is TypeSig) { (obj as TypeSig).WriteTo(output); return; } if (obj is Code) { output.Write(((Code)obj).ToOpCode().Name, TextTokenType.OpCode); return; } // This code gets called by the combobox and it sometimes passes in the empty string. // It's never shown in the UI. Debug.Assert(string.Empty.Equals(obj), "Shouldn't be here"); output.Write(obj.ToString(), TextTokenType.Text); }