internal override bool View(DecompilerTextView textView) { AvalonEditTextOutput output = new AvalonEditTextOutput(); IHighlightingDefinition highlighting = null; textView.RunWithCancellation( token => Task.Factory.StartNew( () => { try { // cache read XAML because stream will be closed after first read if (xaml == null) { using (var reader = new StreamReader(data)) { xaml = reader.ReadToEnd(); } } output.Write(xaml); highlighting = HighlightingManager.Instance.GetDefinitionByExtension(".xml"); } catch (Exception ex) { output.Write(ex.ToString()); } return output; }), t => textView.Show(t.Result, highlighting) ); return true; }
public override void Execute(object parameter) { MainWindow.Instance.TextView.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => { AvalonEditTextOutput output = new AvalonEditTextOutput(); Parallel.ForEach(MainWindow.Instance.CurrentAssemblyList.GetAssemblies(), new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount, CancellationToken = ct }, delegate(LoadedAssembly asm) { if (!asm.HasLoadError) { Stopwatch w = Stopwatch.StartNew(); Exception exception = null; using (var writer = new System.IO.StreamWriter("c:\\temp\\decompiled\\" + asm.ShortName + ".cs")) { try { new CSharpLanguage().DecompileAssembly(asm, new Decompiler.PlainTextOutput(writer), new DecompilationOptions { FullDecompilation = true, CancellationToken = ct }); } catch (Exception ex) { writer.WriteLine(ex.ToString()); exception = ex; } } lock (output) { output.Write(asm.ShortName + " - " + w.Elapsed); if (exception != null) { output.Write(" - "); output.Write(exception.GetType().Name); } output.WriteLine(); } } }); return output; }, ct), task => MainWindow.Instance.TextView.ShowText(task.Result)); }
public override bool View(DecompilerTextView textView) { try { AvalonEditTextOutput output = new AvalonEditTextOutput(); Data.Position = 0; IconBitmapDecoder decoder = new IconBitmapDecoder(Data, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None); foreach (var frame in decoder.Frames) { output.Write(String.Format("{0}x{1}, {2} bit: ", frame.PixelHeight, frame.PixelWidth, frame.Thumbnail.Format.BitsPerPixel)); AddIcon(output, frame); output.WriteLine(); } output.AddButton(Images.Save, "Save", delegate { Save(null); }); textView.ShowNode(output, this); return true; } catch (Exception) { return false; } }
public void Write(string s, TextTokenType tokenType) { if (needsNewLine) { WriteNewLine(); } output.Write(s, tokenType); }
bool LoadBaml(AvalonEditTextOutput output) { var asm = this.Ancestors().OfType<AssemblyTreeNode>().FirstOrDefault().LoadedAssembly; Data.Position = 0; XDocument xamlDocument = LoadIntoDocument(asm.GetAssemblyResolver(), asm.AssemblyDefinition, Data); output.Write(xamlDocument.ToString()); return true; }
public override bool View(DecompilerTextView textView) { if (resElem.ResourceData.Code == ResourceTypeCode.String) { var output = new AvalonEditTextOutput(); output.Write((string)((BuiltInResourceData)resElem.ResourceData).Data, TextTokenType.Text); textView.ShowNode(output, this, null); return true; } if (resElem.ResourceData.Code == ResourceTypeCode.ByteArray || resElem.ResourceData.Code == ResourceTypeCode.Stream) { var data = (byte[])((BuiltInResourceData)resElem.ResourceData).Data; return ResourceTreeNode.View(this, textView, new MemoryStream(data), Name); } return base.View(textView); }
public override bool View(DecompilerTextView textView) { AvalonEditTextOutput output = new AvalonEditTextOutput(); IHighlightingDefinition highlighting = null; textView.RunWithCancellation( token => Task.Factory.StartNew( () => { try { if (LoadBaml(output)) highlighting = HighlightingManager.Instance.GetDefinitionByExtension(".xml"); } catch (Exception ex) { output.Write(ex.ToString()); } return output; }), t => textView.ShowNode(t.Result, this, highlighting) ); return true; }
public override bool View(DecompilerTextView textView) { AvalonEditTextOutput output = new AvalonEditTextOutput(); IHighlightingDefinition highlighting = null; var lang = MainWindow.Instance.CurrentLanguage; textView.RunWithCancellation( token => Task.Factory.StartNew( () => { try { bamlData.Position = 0; var document = BamlReader.ReadDocument(bamlData, token); if (BamlSettings.Instance.DisassembleBaml) Disassemble(module, document, lang, output, out highlighting, token); else Decompile(module, document, lang, output, out highlighting, token); } catch (Exception ex) { output.Write(ex.ToString(), TextTokenType.Text); } return output; }, token) ).Then(t => textView.ShowNode(t, this, highlighting)).HandleExceptions(); return true; }
internal override bool View(DecompilerTextView textView) { EmbeddedResource er = r as EmbeddedResource; if (er != null) { Stream s = er.GetResourceStream(); if (s != null && s.Length < DecompilerTextView.DefaultOutputLengthLimit) { s.Position = 0; FileType type = GuessFileType.DetectFileType(s); if (type != FileType.Binary) { s.Position = 0; AvalonEditTextOutput output = new AvalonEditTextOutput(); output.Write(FileReader.OpenStream(s, Encoding.UTF8).ReadToEnd()); string ext; if (type == FileType.Xml) ext = ".xml"; else ext = Path.GetExtension(DecompilerTextView.CleanUpName(er.Name)); textView.Show(output, HighlightingManager.Instance.GetDefinitionByExtension(ext)); return true; } } } return false; }
void HandleCommandLineArgumentsAfterShowList(CommandLineArguments args) { if (args.NavigateTo != null) { bool found = false; foreach (LoadedAssembly asm in commandLineLoadedAssemblies) { AssemblyDefinition def = asm.AssemblyDefinition; if (def != null) { MemberReference mr = XmlDocKeyProvider.FindMemberByKey(def.MainModule, args.NavigateTo); if (mr != null) { found = true; JumpToReference(mr); break; } } } if (!found) { AvalonEditTextOutput output = new AvalonEditTextOutput(); output.Write("Cannot find " + args.NavigateTo); decompilerTextView.ShowText(output); } } commandLineLoadedAssemblies.Clear(); // clear references once we don't need them anymore }
void Window_RequestNavigate(object sender, RequestNavigateEventArgs e) { if (e.Uri.Scheme == "resource") { AvalonEditTextOutput output = new AvalonEditTextOutput(); using (Stream s = typeof(App).Assembly.GetManifestResourceStream(typeof(App), e.Uri.AbsolutePath)) { using (StreamReader r = new StreamReader(s)) { string line; while ((line = r.ReadLine()) != null) { output.Write(line); output.WriteLine(); } } } ILSpy.MainWindow.Instance.TextView.Show(output); } else { Process.Start(e.Uri.ToString()); } }
bool LoadBaml(AvalonEditTextOutput output) { var asm = this.Ancestors().OfType<AssemblyTreeNode>().FirstOrDefault().LoadedAssembly; AppDomain bamlDecompilerAppDomain = null; try { BamlDecompiler decompiler = CreateBamlDecompilerInAppDomain(ref bamlDecompilerAppDomain, asm.FileName); MemoryStream bamlStream = new MemoryStream(); data.Position = 0; data.CopyTo(bamlStream); output.Write(decompiler.DecompileBaml(bamlStream, asm.FileName)); return true; } finally { if (bamlDecompilerAppDomain != null) AppDomain.Unload(bamlDecompilerAppDomain); } }
void HandleCommandLineArgumentsAfterShowList(CommandLineArguments args) { if (args.NavigateTo != null) { bool found = false; if (args.NavigateTo.StartsWith("N:", StringComparison.Ordinal)) { string namespaceName = args.NavigateTo.Substring(2); foreach (LoadedAssembly asm in commandLineLoadedAssemblies) { AssemblyTreeNode asmNode = assemblyListTreeNode.FindAssemblyNode(asm); if (asmNode != null) { NamespaceTreeNode nsNode = asmNode.FindNamespaceNode(namespaceName); if (nsNode != null) { found = true; SelectNode(nsNode); break; } } } } else { foreach (LoadedAssembly asm in commandLineLoadedAssemblies) { ModuleDefinition def = asm.ModuleDefinition; if (def != null) { MemberReference mr = XmlDocKeyProvider.FindMemberByKey(def, args.NavigateTo); if (mr != null) { found = true; JumpToReference(mr); break; } } } } if (!found) { AvalonEditTextOutput output = new AvalonEditTextOutput(); output.Write(string.Format("Cannot find '{0}' in command line specified assemblies.", args.NavigateTo)); decompilerTextView.ShowText(output); } } else if (commandLineLoadedAssemblies.Count == 1) { // NavigateTo == null and an assembly was given on the command-line: // Select the newly loaded assembly JumpToReference(commandLineLoadedAssemblies[0].ModuleDefinition); } if (args.Search != null) { SearchPane.Instance.SearchTerm = args.Search; SearchPane.Instance.Show(); } if (!string.IsNullOrEmpty(args.SaveDirectory)) { foreach (var x in commandLineLoadedAssemblies) { x.ContinueWhenLoaded( (Task<ModuleDefinition> moduleTask) => { OnExportAssembly(moduleTask, args.SaveDirectory); }, TaskScheduler.FromCurrentSynchronizationContext()); } } commandLineLoadedAssemblies.Clear(); // clear references once we don't need them anymore }
bool LoadBaml(AvalonEditTextOutput output) { var asm = this.Ancestors().OfType<AssemblyTreeNode>().FirstOrDefault().LoadedAssembly; // Construct and initialize settings for a second AppDomain. AppDomainSetup bamlDecompilerAppDomainSetup = new AppDomainSetup(); bamlDecompilerAppDomainSetup.ApplicationBase = "file:///" + Path.GetDirectoryName(asm.FileName); bamlDecompilerAppDomainSetup.DisallowBindingRedirects = false; bamlDecompilerAppDomainSetup.DisallowCodeDownload = true; bamlDecompilerAppDomainSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; // Create the second AppDomain. AppDomain bamlDecompilerAppDomain = AppDomain.CreateDomain("BamlDecompiler AD", null, bamlDecompilerAppDomainSetup); BamlDecompiler decompiler = (BamlDecompiler)bamlDecompilerAppDomain.CreateInstanceFromAndUnwrap(typeof(BamlDecompiler).Assembly.Location, typeof(BamlDecompiler).FullName); MemoryStream bamlStream = new MemoryStream(); value.Position = 0; value.CopyTo(bamlStream); output.Write(decompiler.DecompileBaml(bamlStream, asm.FileName)); return true; }
void Window_RequestNavigate(object sender, RequestNavigateEventArgs e) { if (e.Uri.Scheme == "resource") { AvalonEditTextOutput output = new AvalonEditTextOutput(); using (Stream s = typeof(App).Assembly.GetManifestResourceStream(typeof(dnSpy.StartUpClass), e.Uri.AbsolutePath)) { using (StreamReader r = new StreamReader(s)) { string line; while ((line = r.ReadLine()) != null) { output.Write(line, TextTokenType.Text); output.WriteLine(); } } } var textView = ILSpy.MainWindow.Instance.SafeActiveTextView; textView.ShowText(output); ILSpy.MainWindow.Instance.SetTitle(textView, e.Uri.AbsolutePath); e.Handled = true; } }
void HandleCommandLineArgumentsAfterShowList(CommandLineArguments args) { if (args.NavigateTo != null) { bool found = false; if (args.NavigateTo.StartsWith("N:", StringComparison.Ordinal)) { string namespaceName = args.NavigateTo.Substring(2); foreach (LoadedAssembly asm in commandLineLoadedAssemblies) { AssemblyTreeNode asmNode = assemblyListTreeNode.FindAssemblyNode(asm); if (asmNode != null) { NamespaceTreeNode nsNode = asmNode.FindNamespaceNode(namespaceName); if (nsNode != null) { found = true; SelectNode(nsNode); break; } } } } else { foreach (LoadedAssembly asm in commandLineLoadedAssemblies) { AssemblyDefinition def = asm.AssemblyDefinition; if (def != null) { MemberReference mr = XmlDocKeyProvider.FindMemberByKey(def.MainModule, args.NavigateTo); if (mr != null) { found = true; JumpToReference(mr); break; } } } } if (!found) { AvalonEditTextOutput output = new AvalonEditTextOutput(); output.Write("Cannot find " + args.NavigateTo); decompilerTextView.ShowText(output); } } commandLineLoadedAssemblies.Clear(); // clear references once we don't need them anymore }
void HandleCommandLineArgumentsAfterShowList(CommandLineArguments args) { if (args.NavigateTo != null) { bool found = false; if (args.NavigateTo.StartsWith("N:", StringComparison.Ordinal)) { string namespaceName = args.NavigateTo.Substring(2); foreach (LoadedAssembly asm in commandLineLoadedAssemblies) { AssemblyTreeNode asmNode = assemblyListTreeNode.FindAssemblyNode(asm); if (asmNode != null) { NamespaceTreeNode nsNode = asmNode.FindNamespaceNode(namespaceName); if (nsNode != null) { found = true; SelectNode(nsNode); break; } } } } else { foreach (LoadedAssembly asm in commandLineLoadedAssemblies) { ModuleDefinition def = asm.ModuleDefinition; if (def != null) { MemberReference mr = XmlDocKeyProvider.FindMemberByKey(def, args.NavigateTo); if (mr != null) { found = true; JumpToReference(mr); break; } } } } if (!found) { AvalonEditTextOutput output = new AvalonEditTextOutput(); output.Write(string.Format("Cannot find '{0}' in command line specified assemblies.", args.NavigateTo)); decompilerTextView.ShowText(output); } } else if (commandLineLoadedAssemblies.Count == 1) { // NavigateTo == null and an assembly was given on the command-line: // Select the newly loaded assembly JumpToReference(commandLineLoadedAssemblies[0].ModuleDefinition); } commandLineLoadedAssemblies.Clear(); // clear references once we don't need them anymore }
internal static bool View(ILSpyTreeNode node, DecompilerTextView textView, Stream stream, string name) { if (stream == null || stream.Length >= DecompilerTextView.DefaultOutputLengthLimit) return false; stream.Position = 0; FileType type = GuessFileType.DetectFileType(stream); if (type == FileType.Binary) return false; stream.Position = 0; AvalonEditTextOutput output = new AvalonEditTextOutput(); output.Write(FileReader.OpenStream(stream, Encoding.UTF8).ReadToEnd(), TextTokenType.Text); string ext; if (type == FileType.Xml) ext = ".xml"; else { try { ext = Path.GetExtension(DecompilerTextView.CleanUpName(name)); } catch (ArgumentException) { ext = ".txt"; } } textView.ShowNode(output, node, HighlightingManager.Instance.GetDefinitionByExtension(ext)); return true; }
public override bool View(DecompilerTextView textView) { AvalonEditTextOutput output = new AvalonEditTextOutput(); IHighlightingDefinition highlighting = null; textView.RunWithCancellation( token => Task.Factory.StartNew( () => { try { // cache read XAML because stream will be closed after first read if (xml == null) { using (var reader = new StreamReader(Data)) { xml = reader.ReadToEnd(); } } output.Write(xml, TextTokenType.Text); highlighting = HighlightingManager.Instance.GetDefinitionByExtension(".xml"); } catch (Exception ex) { output.Write(ex.ToString(), TextTokenType.Text); } return output; }, token) ).Then(t => textView.ShowNode(t, this, highlighting)).HandleExceptions(); return true; }
void HandleCommandLineArgumentsAfterShowList(CommandLineArguments args) { if (args.NavigateTo != null) { bool found = false; if (args.NavigateTo.StartsWith("N:", StringComparison.Ordinal)) { string namespaceName = args.NavigateTo.Substring(2); foreach (DnSpyFile asm in commandLineLoadedFiles) { AssemblyTreeNode asmNode = dnSpyFileListTreeNode.FindAssemblyNode(asm); if (asmNode != null) { NamespaceTreeNode nsNode = asmNode.FindNamespaceNode(namespaceName); if (nsNode != null) { found = true; SelectNode(nsNode); break; } } } } else { foreach (DnSpyFile asm in commandLineLoadedFiles) { ModuleDef def = asm.ModuleDef; if (def != null) { IMemberRef mr = XmlDocKeyProvider.FindMemberByKey(def, args.NavigateTo); if (mr != null) { found = true; JumpToReference(mr); break; } } } } if (!found) { AvalonEditTextOutput output = new AvalonEditTextOutput(); output.Write(string.Format("Cannot find '{0}' in command line specified assemblies.", args.NavigateTo), TextTokenType.Text); SafeActiveTextView.ShowText(output); } } else if (commandLineLoadedFiles.Count == 1) { // NavigateTo == null and an assembly was given on the command-line: // Select the newly loaded assembly JumpToReference(commandLineLoadedFiles[0].ModuleDef); } if (args.Search != null) { SearchPane.Instance.SearchTerm = args.Search; SearchPane.Instance.Show(); } if (!string.IsNullOrEmpty(args.SaveDirectory)) { foreach (var x in commandLineLoadedFiles) OnExportAssembly(x, args.SaveDirectory); } commandLineLoadedFiles.Clear(); // clear references once we don't need them anymore }