From 3c607a89fc62ef74afab8252fd8637346a5747de Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Thu, 2 Nov 2017 10:29:05 +0100 Subject: [PATCH] Update the workbook with more samples and generalized demo assembly loading --- DecompilerNuGetDemos.workbook | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/DecompilerNuGetDemos.workbook b/DecompilerNuGetDemos.workbook index bb61c933a..d1c5219e2 100644 --- a/DecompilerNuGetDemos.workbook +++ b/DecompilerNuGetDemos.workbook @@ -9,26 +9,53 @@ packages: version: 3.0.0.3214-beta1 --- -Load the references required to work with the decompiler +Setup: load the references required to work with the decompiler ```csharp #r "ICSharpCode.Decompiler" #r "Mono.Cecil" +using Mono.Cecil; using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.CSharp; using ICSharpCode.Decompiler.TypeSystem; ``` -You must have compiled frontends.sln first - please adapt basePath accordingly so that the console assembly is found +You must have compiled **frontends.sln** first (run “dotnet build” in ICSharpCode.Decompiler.PowerShell folder) ```csharp -string basePath = @"D:\GitWorkspace\ILSpy"; -string fileName = basePath + @"\ICSharpCode.Decompiler.Console\bin\Debug\netcoreapp2.0\ilspycmd.dll"; +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 + ```csharp var types = decompiler.TypeSystem.Compilation.MainAssembly.GetAllTypeDefinitions(); Console.WriteLine(types.Count()); +``` + +Decompile a known type (as a whole) + +```csharp +// ICSharpCode.Decompiler.Util.Empty -> 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) + +```csharp +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 + +```csharp +ITypeDefinition type = decompiler.TypeSystem.Compilation.FindType(nameOfUniResolver).GetDefinition(); +var module = decompiler.TypeSystem.GetCecil(type).Module ``` \ No newline at end of file