From 5988520b642fe5aaa2a57fad7f983b855a758bed Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 1 Feb 2014 14:46:35 +0100 Subject: [PATCH] fix #292: Opening .xaml file that makes use of user controls causes SharpDevelop to load the user .dlls --- .../WpfDesign.AddIn/Src/MyTypeFinder.cs | 23 +++++----- .../WpfDesign.AddIn/Src/WpfToolbox.cs | 44 +++++++++---------- .../WpfDesign.AddIn/Src/WpfViewContent.cs | 28 ++++++------ 3 files changed, 49 insertions(+), 46 deletions(-) diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/MyTypeFinder.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/MyTypeFinder.cs index 18a54bbd3e..cb867140e6 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/MyTypeFinder.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/MyTypeFinder.cs @@ -41,17 +41,18 @@ namespace ICSharpCode.WpfDesign.AddIn f.file = file; f.ImportFrom(CreateWpfTypeFinder()); - // TODO : reimplement this! - // DO NOT USE Assembly.LoadFrom -// var compilation = SD.ParserService.GetCompilationForFile(file.FileName); -// foreach (var referencedAssembly in compilation.ReferencedAssemblies) { -// try { -// var assembly = Assembly.LoadFrom(referencedAssembly.GetReferenceAssemblyLocation()); -// f.RegisterAssembly(assembly); -// } catch (Exceptions ex) { -// ICSharpCode.Core.LoggingService.Warn("Error loading Assembly : " + referencedAssembly.FullAssemblyName, ex); -// } -// } + // DO NOT USE Assembly.LoadFrom! + // use the special handling logic defined in TypeResolutionService! + var compilation = SD.ParserService.GetCompilationForFile(file.FileName); + foreach (var referencedAssembly in compilation.ReferencedAssemblies) { + try { + var assembly = f.typeResolutionService.LoadAssembly(referencedAssembly); + if (assembly != null) + f.RegisterAssembly(assembly); + } catch (Exception ex) { + ICSharpCode.Core.LoggingService.Warn("Error loading Assembly : " + referencedAssembly.FullAssemblyName, ex); + } + } return f; } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfToolbox.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfToolbox.cs index 3d2003fd1a..a02ffefab8 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfToolbox.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfToolbox.cs @@ -90,28 +90,28 @@ namespace ICSharpCode.WpfDesign.AddIn try { // DO NOT USE Assembly.LoadFrom!!! // see http://community.sharpdevelop.net/forums/t/19968.aspx - // TODO : reimplement this! -// var assembly = Assembly.LoadFrom(f); -// -// SideTab sideTab = new SideTab(sideBar, assembly.FullName.Split(new[] {','})[0]); -// sideTab.DisplayName = StringParser.Parse(sideTab.Name); -// sideTab.CanBeDeleted = false; -// sideTab.ChoosedItemChanged += OnChoosedItemChanged; -// -// sideTab.Items.Add(new WpfSideTabItem()); -// -// foreach (var t in assembly.GetExportedTypes()) -// { -// if (IsControl(t)) -// { -// sideTab.Items.Add(new WpfSideTabItem(t)); -// } -// } -// -// if (sideTab.Items.Count > 1) -// sideBar.Tabs.Add(sideTab); -// -// addedAssemblys.Add(f); + Assembly assembly = typeResolutionService.LoadAssembly(assemblyFileName); + if (assembly == null) continue; + + SideTab sideTab = new SideTab(sideBar, assembly.FullName.Split(new[] {','})[0]); + sideTab.DisplayName = StringParser.Parse(sideTab.Name); + sideTab.CanBeDeleted = false; + sideTab.ChosenItemChanged += OnChosenItemChanged; + + sideTab.Items.Add(new WpfSideTabItem()); + + foreach (var t in assembly.GetExportedTypes()) + { + if (IsControl(t)) + { + sideTab.Items.Add(new WpfSideTabItem(t)); + } + } + + if (sideTab.Items.Count > 1) + sideBar.Tabs.Add(sideTab); + + addedAssemblies.Add(assemblyFileName); } catch (Exception ex) { WpfViewContent.DllLoadErrors.Add(new SDTask(new BuildError(assemblyFileName, ex.Message))); } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs index 15076ac7f2..d0bb308273 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs @@ -58,21 +58,9 @@ namespace ICSharpCode.WpfDesign.AddIn BasicMetadata.Register(); - // TODO Move this Initialization to LoadInternal -// WpfToolbox.Instance.AddProjectDlls(file); - - ProjectService.ProjectItemAdded += ProjectService_ProjectItemAdded; - this.TabPageText = "${res:FormsDesigner.DesignTabPages.DesignTabPage}"; this.IsActiveViewContentChanged += OnIsActiveViewContentChanged; } - - void ProjectService_ProjectItemAdded(object sender, ProjectItemEventArgs e) - { - // TODO reimplement this! -// if (e.ProjectItem is ReferenceProjectItem) -// WpfToolbox.Instance.AddProjectDlls(this.Files[0]); - } static WpfViewContent() { @@ -106,6 +94,7 @@ namespace ICSharpCode.WpfDesign.AddIn designer = new DesignSurface(); this.UserContent = designer; InitPropertyEditor(); + InitWpfToolbox(); } this.UserContent = designer; if (outline != null) { @@ -204,6 +193,19 @@ namespace ICSharpCode.WpfDesign.AddIn propertyContainer.PropertyGridReplacementContent = propertyGridView; propertyGridView.PropertyGrid.PropertyChanged += OnPropertyGridPropertyChanged; } + + void InitWpfToolbox() + { + WpfToolbox.Instance.AddProjectDlls(Files[0]); + SD.ProjectService.ProjectItemAdded += OnReferenceAdded; + } + + void OnReferenceAdded(object sender, ProjectItemEventArgs e) + { + if (!(e.ProjectItem is ReferenceProjectItem)) return; + if (e.Project != SD.ProjectService.FindProjectContainingFile(Files[0].FileName)) return; + WpfToolbox.Instance.AddProjectDlls(Files[0]); + } void OnSelectionChanged(object sender, DesignItemCollectionEventArgs e) { @@ -281,7 +283,7 @@ namespace ICSharpCode.WpfDesign.AddIn public override void Dispose() { - ProjectService.ProjectItemAdded -= ProjectService_ProjectItemAdded; + SD.ProjectService.ProjectItemAdded -= OnReferenceAdded; propertyContainer.Clear(); base.Dispose();