Skip to content

Latest commit

 

History

History
78 lines (60 loc) · 2.4 KB

File metadata and controls

78 lines (60 loc) · 2.4 KB
uti com.xamarin.workbook
id de255e90-ba7b-4070-be45-65e544ae8219
title DecompilerPackageDemos
platforms
DotNetCore
packages
id version
ICSharpCode.Decompiler
3.1.0.3652

Setup: load the references required to work with the decompiler

#r "ICSharpCode.Decompiler"
#r "Mono.Cecil"

using Mono.Cecil;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.CSharp;
using ICSharpCode.Decompiler.TypeSystem;

// Version sanity check
Console.WriteLine(typeof(FullTypeName).Assembly.GetName());

You must have compiled frontends.sln first (run “dotnet build” in ICSharpCode.Decompiler.PowerShell folder)

string workbookBasePath = System.IO.Directory.GetCurrentDirectory();
string fileName = System.IO.Path.Combine(workbookBasePath, "ICSharpCode.Decompiler.PowerShell", "bin", "Debug", "netstandard2.0", "ICSharpCode.Decompiler.dll");
var decompiler = new CSharpDecompiler(fileName, new DecompilerSettings());

Get the count of types in this assembly

var types = decompiler.TypeSystem.Compilation.MainAssembly.GetAllTypeDefinitions();
Console.WriteLine(types.Count());

Decompile a known type (as a whole)

// ICSharpCode.Decompiler.Util.Empty<T> -> translates to `n, where n is the # of generic parameters
var nameOfGenericType =  new FullTypeName("ICSharpCode.Decompiler.Util.Empty`1");
Console.WriteLine(decompiler.DecompileTypeAsString(nameOfGenericType));

If you want to decompile one single member (sample: first property)

var nameOfUniResolver =  new FullTypeName("ICSharpCode.Decompiler.UniversalAssemblyResolver");
ITypeDefinition typeInfo = decompiler.TypeSystem.Compilation.FindType(nameOfUniResolver).GetDefinition();
IMemberDefinition cecilProperty = decompiler.TypeSystem.GetCecil(typeInfo.Properties.First()).Resolve();
Console.WriteLine(decompiler.DecompileAsString(cecilProperty));

If you need the Cecil ModuleDefinition

ITypeDefinition type = decompiler.TypeSystem.Compilation.FindType(nameOfUniResolver).GetDefinition();
var module = decompiler.TypeSystem.GetCecil(type).Module

Get the child namespaces

var icsdns = decompiler.TypeSystem.Compilation.RootNamespace;
foreach (var ns in icsdns.ChildNamespaces) Console.WriteLine(ns.FullName);

Get types in a single namespace

// ICSharpCode.Decompiler.TypeSystem is the first namespace
var typesInNamespace = icsdns.ChildNamespaces.First().Types;