diff --git a/src/Main/Base/Project/Designer/TypeResolutionService.cs b/src/Main/Base/Project/Designer/TypeResolutionService.cs index dffe5ab729..f69bff6d15 100644 --- a/src/Main/Base/Project/Designer/TypeResolutionService.cs +++ b/src/Main/Base/Project/Designer/TypeResolutionService.cs @@ -411,9 +411,11 @@ namespace ICSharpCode.SharpDevelop.Designer ITypeDefinition definition = ReflectionHelper.ParseReflectionName(name) .Resolve(compilation).GetDefinition(); if (definition != null) { - Assembly assembly = LoadAssembly(definition.ParentAssembly); - if (assembly != null) { - type = assembly.GetType(name, false, ignoreCase); + using (var resolver = new ProjectAssemblyResolver(compilation, this)) { + Assembly assembly = LoadAssembly(definition.ParentAssembly); + if (assembly != null) { + type = assembly.GetType(name, false, ignoreCase); + } } } } @@ -582,5 +584,37 @@ namespace ICSharpCode.SharpDevelop.Designer } return lastAssembly; } + + class ProjectAssemblyResolver : IDisposable + { + readonly ICompilation compilation; + readonly TypeResolutionService typeResolutionService; + + public ProjectAssemblyResolver(ICompilation compilation, TypeResolutionService typeResolutionService) + { + this.compilation = compilation; + this.typeResolutionService = typeResolutionService; + AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve; + } + + public void Dispose() + { + AppDomain.CurrentDomain.AssemblyResolve -= AssemblyResolve; + } + + Assembly AssemblyResolve(object sender, ResolveEventArgs args) + { + try { + IAssembly assembly = compilation.Assemblies + .FirstOrDefault(asm => asm.FullAssemblyName == args.Name); + if (assembly != null) { + return typeResolutionService.LoadAssembly(assembly); + } + } catch (Exception ex) { + LoggingService.Error(ex); + } + return null; + } + } } }