Browse Source

add global cache for Cecil's AssemblyDefinition in ILSpyDecompilerService

newNRILSpyDebugger
Siegfried Pammer 12 years ago
parent
commit
f00cbc8f50
  1. 25
      src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyDecompilerService.cs

25
src/AddIns/DisplayBindings/ILSpyAddIn/ILSpyDecompilerService.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -20,6 +21,8 @@ namespace ICSharpCode.ILSpyAddIn
/// </summary> /// </summary>
public static class ILSpyDecompilerService public static class ILSpyDecompilerService
{ {
static readonly Dictionary<FileName, AssemblyDefinition> assemblyCache = new Dictionary<FileName, AssemblyDefinition>();
class ILSpyAssemblyResolver : DefaultAssemblySearcher, IAssemblyResolver class ILSpyAssemblyResolver : DefaultAssemblySearcher, IAssemblyResolver
{ {
public ILSpyAssemblyResolver(FileName fileName) public ILSpyAssemblyResolver(FileName fileName)
@ -27,6 +30,20 @@ namespace ICSharpCode.ILSpyAddIn
{ {
} }
AssemblyDefinition Resolve(DomAssemblyName name, ReaderParameters parameters)
{
var file = FindAssembly(name);
if (file == null) return null;
AssemblyDefinition asm;
lock (assemblyCache) {
if (!assemblyCache.TryGetValue(file, out asm)) {
asm = AssemblyDefinition.ReadAssembly(file, parameters);
assemblyCache.Add(file, asm);
}
}
return asm;
}
public AssemblyDefinition Resolve(AssemblyNameReference name) public AssemblyDefinition Resolve(AssemblyNameReference name)
{ {
return Resolve(name, new ReaderParameters()); return Resolve(name, new ReaderParameters());
@ -34,9 +51,7 @@ namespace ICSharpCode.ILSpyAddIn
public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters)
{ {
var file = FindAssembly(new DomAssemblyName(name.FullName)); return Resolve(new DomAssemblyName(name.FullName), parameters);
if (file == null) return null;
return AssemblyDefinition.ReadAssembly(file, parameters);
} }
public AssemblyDefinition Resolve(string fullName) public AssemblyDefinition Resolve(string fullName)
@ -46,9 +61,7 @@ namespace ICSharpCode.ILSpyAddIn
public AssemblyDefinition Resolve(string fullName, ReaderParameters parameters) public AssemblyDefinition Resolve(string fullName, ReaderParameters parameters)
{ {
var file = FindAssembly(new DomAssemblyName(fullName)); return Resolve(new DomAssemblyName(fullName), parameters);
if (file == null) return null;
return AssemblyDefinition.ReadAssembly(file, parameters);
} }
} }

Loading…
Cancel
Save