// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under MIT X11 license (for details please see \doc\license.txt) using System.Composition; using System.Reflection.Metadata; using Avalonia.Controls; using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.TypeSystem; using ILSpy; using ILSpy.Languages; using ILSpy.TextView; namespace TestPlugin { /// /// Adds a new language to the decompiler. /// [Export(typeof(Language))] [Shared] public class CustomLanguage : Language { public override string Name { get { return "Custom"; } } public override string FileExtension { get { // used in 'Save As' dialog return ".txt"; } } // There are several methods available to override; in this sample, we deal with methods only public override void DecompileMethod(IMethod method, ITextOutput output, DecompilationOptions options) { var module = ((MetadataModule)method.ParentModule!).MetadataFile; var methodDef = module.Metadata.GetMethodDefinition((MethodDefinitionHandle)method.MetadataToken); if (methodDef.HasBody()) { var methodBody = module.GetMethodBody(methodDef.RelativeVirtualAddress); output.WriteLine("Size of method: {0} bytes", methodBody.GetCodeSize()); if (output is ISmartTextOutput smartOutput) { // when writing to the text view (but not when writing to a file), we can even add UI elements such as buttons: smartOutput.AddButton(null, "Click me!", (sender, e) => { if (sender is Button button) button.Content = "I was clicked!"; }); smartOutput.WriteLine(); } } } } }