From 34f7fe33417649ad2049bc71b2588324ba7b8f7c Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 12 Aug 2018 15:23:41 +0200 Subject: [PATCH] Add CreateCecilObjectModel extension method as helper for plugin developers. --- ILSpy/LoadedAssemblyExtensions.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/ILSpy/LoadedAssemblyExtensions.cs b/ILSpy/LoadedAssemblyExtensions.cs index 01973aad2..c6d727c75 100644 --- a/ILSpy/LoadedAssemblyExtensions.cs +++ b/ILSpy/LoadedAssemblyExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Runtime.CompilerServices; using System.Text; @@ -12,6 +13,23 @@ namespace ICSharpCode.ILSpy { public static class LoadedAssemblyExtensions { + /// + /// This method creates a Cecil object model from a PEFile. It is intended as helper method for plugins. + /// Note that this method is expensive and creates high memory pressure! + /// Note that accessing the Cecil objects created by this method after an assembly has been unloaded by ILSpy + /// might lead to or similar. + /// + /// Use only as last resort if there is something missing in the official ILSpy API. + /// Consider creating an issue at https://github.com/icsharpcode/ILSpy/issues/new + /// and discussing the problem with us. + public unsafe static Mono.Cecil.ModuleDefinition CreateCecilObjectModel(this PEFile file) + { + if (!file.Reader.IsEntireImageAvailable) + throw new InvalidOperationException("Need full image to create Cecil object model!"); + var image = file.Reader.GetEntireImage(); + return Mono.Cecil.ModuleDefinition.ReadModule(new UnmanagedMemoryStream(image.Pointer, image.Length)); + } + public static IAssemblyResolver GetAssemblyResolver(this PEFile file) { return GetLoadedAssembly(file).GetAssemblyResolver();