diff --git a/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/DirectoryAssemblyResolver.cs b/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/DirectoryAssemblyResolver.cs index 7068c4112..d2a41d9d0 100644 --- a/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/DirectoryAssemblyResolver.cs +++ b/src/Java.Interop.Tools.Cecil/Java.Interop.Tools.Cecil/DirectoryAssemblyResolver.cs @@ -64,7 +64,12 @@ public class DirectoryAssemblyResolver : IAssemblyResolver { bool loadDebugSymbols; Action logWarnings; - public DirectoryAssemblyResolver (Action logWarnings, bool loadDebugSymbols) + ReaderParameters loadReaderParameters; + + static readonly ReaderParameters DefaultLoadReaderParameters = new ReaderParameters { + }; + + public DirectoryAssemblyResolver (Action logWarnings, bool loadDebugSymbols, ReaderParameters loadReaderParameters = null) { if (logWarnings == null) throw new ArgumentNullException (nameof (logWarnings)); @@ -72,6 +77,7 @@ public DirectoryAssemblyResolver (Action logWarnings, bool loa this.loadDebugSymbols = loadDebugSymbols; this.logWarnings = logWarnings; SearchDirectories = new List (); + this.loadReaderParameters = loadReaderParameters ?? DefaultLoadReaderParameters; } public void Dispose () @@ -82,8 +88,15 @@ public void Dispose () protected virtual void Dispose (bool disposing) { + if (!disposing || cache == null) + return; + foreach (var e in cache) { + e.Value.Dispose (); + } + cache = null; } + [Obsolete ("Should not be used; was required with previous Cecil versions.")] public IDictionary ToResolverCache () { var resolver_cache = new Hashtable (); @@ -114,9 +127,21 @@ public virtual AssemblyDefinition Load (string fileName) protected virtual AssemblyDefinition ReadAssembly (string file) { + bool haveDebugSymbols = loadDebugSymbols && + (File.Exists (file + ".mdb") || + File.Exists (Path.ChangeExtension (file, ".pdb"))); var reader_parameters = new ReaderParameters () { - AssemblyResolver = this, - ReadSymbols = loadDebugSymbols && (File.Exists(file + ".mdb") || File.Exists(Path.ChangeExtension(file, ".pdb"))), + ApplyWindowsRuntimeProjections = loadReaderParameters.ApplyWindowsRuntimeProjections, + AssemblyResolver = this, + MetadataImporterProvider = loadReaderParameters.MetadataImporterProvider, + InMemory = loadReaderParameters.InMemory, + MetadataResolver = loadReaderParameters.MetadataResolver, + ReadingMode = loadReaderParameters.ReadingMode, + ReadSymbols = haveDebugSymbols, + ReadWrite = loadReaderParameters.ReadWrite, + ReflectionImporterProvider = loadReaderParameters.ReflectionImporterProvider, + SymbolReaderProvider = loadReaderParameters.SymbolReaderProvider, + SymbolStream = loadReaderParameters.SymbolStream, }; try { return AssemblyDefinition.ReadAssembly (file, reader_parameters); diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGenerator.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGenerator.cs index 188aba9f5..a39775135 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGenerator.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGenerator.cs @@ -68,13 +68,15 @@ public TypeNameMapGenerator (IEnumerable assemblies, Action types, Action logMessage) diff --git a/tools/generator/CodeGenerator.cs b/tools/generator/CodeGenerator.cs index 320863cf6..2a9760a29 100644 --- a/tools/generator/CodeGenerator.cs +++ b/tools/generator/CodeGenerator.cs @@ -209,6 +209,13 @@ public static void Run (CodeGeneratorOptions options) if (options == null) throw new ArgumentNullException ("options"); + using (var resolver = new DirectoryAssemblyResolver (Console.WriteLine, loadDebugSymbols: false)) { + Run (options, resolver); + } + } + + static void Run (CodeGeneratorOptions options, DirectoryAssemblyResolver resolver) + { string assemblyQN = options.AssemblyQualifiedName; string api_level = options.ApiLevel; int product_version = options.ProductVersion; @@ -239,7 +246,6 @@ public static void Run (CodeGeneratorOptions options) // Load reference libraries - var resolver = new DirectoryAssemblyResolver (Console.WriteLine, loadDebugSymbols: false); foreach (var lib in options.LibraryPaths) { resolver.SearchDirectories.Add (lib); } diff --git a/tools/jcw-gen/App.cs b/tools/jcw-gen/App.cs index 1f263c698..8de3ac526 100644 --- a/tools/jcw-gen/App.cs +++ b/tools/jcw-gen/App.cs @@ -71,6 +71,9 @@ public static int Main (string [] args) Console.Error.Write ("jcw-gen: {0}", verbosity > 0 ? e.ToString () : e.Message); return 1; } + finally { + resolver.Dispose (); + } } static void GenerateJavaCallableWrapper (TypeDefinition type, string outputPath)