You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.4 KiB
79 lines
2.4 KiB
---
|
|
uti: com.xamarin.workbook
|
|
id: de255e90-ba7b-4070-be45-65e544ae8219
|
|
title: DecompilerPackageDemos
|
|
platforms:
|
|
- DotNetCore
|
|
packages:
|
|
- id: ICSharpCode.Decompiler
|
|
version: 7.0.0.6488
|
|
---
|
|
|
|
Setup: load the references required to work with the decompiler
|
|
|
|
```csharp
|
|
#r "ICSharpCode.Decompiler"
|
|
#r "System.Reflection.Metadata"
|
|
|
|
using System.Reflection.Metadata;
|
|
using ICSharpCode.Decompiler;
|
|
using ICSharpCode.Decompiler.CSharp;
|
|
using ICSharpCode.Decompiler.Metadata;
|
|
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)
|
|
|
|
```csharp
|
|
string workbookBasePath = System.IO.Directory.GetCurrentDirectory();
|
|
string fileName = System.IO.Path.Combine(workbookBasePath, "ICSharpCode.Decompiler.PowerShell", "bin", "Release", "netstandard2.0", "ICSharpCode.Decompiler.dll");
|
|
var decompiler = new CSharpDecompiler(fileName, new DecompilerSettings());
|
|
```
|
|
|
|
Get the count of types in this module
|
|
|
|
```csharp
|
|
var types = decompiler.TypeSystem.MainModule.TypeDefinitions;
|
|
Console.WriteLine(types.Count());
|
|
```
|
|
|
|
Decompile a known type (as a whole)
|
|
|
|
```csharp
|
|
// 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 method)
|
|
|
|
```csharp
|
|
var nameOfUniResolver = new FullTypeName("ICSharpCode.Decompiler.Metadata.UniversalAssemblyResolver");
|
|
ITypeDefinition typeInfo = decompiler.TypeSystem.FindType(nameOfUniResolver).GetDefinition();
|
|
var tokenOfFirstMethod = typeInfo.Methods.First().MetadataToken;
|
|
Console.WriteLine(decompiler.DecompileAsString(tokenOfFirstMethod));
|
|
```
|
|
|
|
If you need access to low-level metadata tables
|
|
|
|
```csharp
|
|
ITypeDefinition type = decompiler.TypeSystem.FindType(nameOfUniResolver).GetDefinition();
|
|
var module = type.ParentModule.PEFile;
|
|
```
|
|
|
|
Get the child namespaces
|
|
|
|
```csharp
|
|
var icsdns = decompiler.TypeSystem.RootNamespace;
|
|
foreach (var ns in icsdns.ChildNamespaces) Console.WriteLine(ns.FullName);
|
|
```
|
|
|
|
Get types in a single namespace
|
|
|
|
```csharp
|
|
// ICSharpCode.Decompiler.TypeSystem is the first namespace
|
|
var typesInNamespace = icsdns.ChildNamespaces.First().Types;
|
|
```
|