示例#1
0
        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());
            }
        }
示例#2
0
        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);
        }