diff --git a/JSIL/CILSupport.cs b/JSIL/CILSupport.cs index 739536918..36aa351a7 100644 --- a/JSIL/CILSupport.cs +++ b/JSIL/CILSupport.cs @@ -82,6 +82,9 @@ public class AssemblyResolver : BaseAssemblyResolver, IDisposable { 25, 52, 224, 137 }; + private readonly object _syncRoot = new object(); + private readonly List _directories = new List(); + protected readonly Configuration Configuration; protected readonly AssemblyCache Cache; protected readonly bool OwnsCache; @@ -101,6 +104,34 @@ public void Dispose () { Cache.Dispose(); } + public new void AddSearchDirectory(string directory) + { + lock (_syncRoot) + { + if (_directories.Contains(directory)) + return; + _directories.Add(directory); + base.AddSearchDirectory(directory); + } + } + + public new void RemoveSearchDirectory(string directory) + { + lock (_syncRoot) + { + _directories.Remove(directory); + base.RemoveSearchDirectory(directory); + } + } + + public new string[] GetSearchDirectories() + { + lock (_syncRoot) + { + return base.GetSearchDirectories(); + } + } + public AssemblyNameReference FilterPortableClassLibraryReferences (AssemblyNameReference name) { // Portable class libraries are pretty shoddily constructed. Who came up with this nonsense? @@ -141,8 +172,12 @@ public override AssemblyDefinition Resolve (AssemblyNameReference name, ReaderPa string redirectedFrom; actualName = FilterRedirectedReferences(name, out redirectedFrom); - var result = Cache.GetOrCreate(actualName.FullName, (fullName) => { - var assembly = base.Resolve(actualName, parameters); + var result = Cache.GetOrCreate(actualName.FullName, (fullName) => + { + AssemblyDefinition assembly; + lock (_syncRoot) + assembly = base.Resolve(actualName, parameters); + if (redirectedFrom != null) Console.Error.WriteLine("// Redirected '{0}' to '{1}'", redirectedFrom, actualName.FullName);