diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs index 34f35002e5..260844a251 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs @@ -378,7 +378,8 @@ namespace ICSharpCode.SharpDevelop.Gui } }); - MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray()); + string mscorlibPath; + MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray(), out mscorlibPath); WorkbenchSingleton.SafeThreadAsyncCall( delegate { @@ -422,7 +423,8 @@ namespace ICSharpCode.SharpDevelop.Gui } }); - MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray()); + string mscorlibPath; + MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray(), out mscorlibPath); foreach (ReferenceProjectItem rpi in referenceItems) { if (string.IsNullOrEmpty(rpi.Redist)) continue; if (!redistNameToRequiredFramework.ContainsKey(rpi.Redist)) { diff --git a/src/Main/Base/Project/Src/Project/CompilableProject.cs b/src/Main/Base/Project/Src/Project/CompilableProject.cs index aef89e2909..24b814be25 100644 --- a/src/Main/Base/Project/Src/Project/CompilableProject.cs +++ b/src/Main/Base/Project/Src/Project/CompilableProject.cs @@ -206,8 +206,6 @@ namespace ICSharpCode.SharpDevelop.Project protected override ParseProjectContent CreateProjectContent() { ParseProjectContent newProjectContent = new ParseProjectContent(this); - var mscorlib = AssemblyParserService.GetRegistryForReference(new ReferenceProjectItem(this, "mscorlib")).Mscorlib; - newProjectContent.AddReferencedContent(mscorlib); return newProjectContent; } diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index 20314f7de3..07917ac7c8 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -137,9 +137,21 @@ namespace ICSharpCode.SharpDevelop.Project } } + volatile string mscorlibPath; + + /// + /// Gets the path to mscorlib. + /// This property is set only after ResolveAssemblyReferences() is called. + /// + public string MscorlibPath { + get { return mscorlibPath; } + } + public override void ResolveAssemblyReferences() { - MSBuildInternals.ResolveAssemblyReferences(this, null); + string mscorlib; + MSBuildInternals.ResolveAssemblyReferences(this, null, out mscorlib); + this.mscorlibPath = mscorlib; } #region CreateProjectItem diff --git a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs index 244cf50c6d..5760270806 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs @@ -5,8 +5,8 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; - using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Dom; using Microsoft.Build.Construction; using Microsoft.Build.Execution; using Microsoft.Build.Framework; @@ -162,7 +162,7 @@ namespace ICSharpCode.SharpDevelop.Project /// The base project. /// A different set of references to use instead of those in the project. /// Used by the GacReferencePanel. - internal static void ResolveAssemblyReferences(MSBuildBasedProject baseProject, ReferenceProjectItem[] referenceReplacements) + internal static void ResolveAssemblyReferences(MSBuildBasedProject baseProject, ReferenceProjectItem[] referenceReplacements, out string mscorlibPath) { ProjectInstance project = baseProject.CreateProjectInstance(); project.SetProperty("BuildingProject", "false"); @@ -215,18 +215,22 @@ namespace ICSharpCode.SharpDevelop.Project referenceDict[item.Include] = item; } - + mscorlibPath = null; foreach (ProjectItemInstance item in project.GetItems("_ResolveAssemblyReferenceResolvedFiles")) { + DomAssemblyName assemblyName = new DomAssemblyName(item.GetMetadataValue("FusionName")); + string fullPath = FileUtility.GetAbsolutePath(baseProject.Directory, item.GetMetadataValue("Identity")); + string originalInclude = item.GetMetadataValue("OriginalItemSpec"); ReferenceProjectItem reference; if (referenceDict.TryGetValue(originalInclude, out reference)) { reference.AssemblyName = new Dom.DomAssemblyName(item.GetMetadataValue("FusionName")); - //string fullPath = item.GetEvaluatedMetadata("FullPath"); is incorrect for relative paths - string fullPath = FileUtility.GetAbsolutePath(baseProject.Directory, item.GetMetadataValue("Identity")); reference.FileName = fullPath; reference.Redist = item.GetMetadataValue("Redist"); LoggingService.Debug("Got information about " + originalInclude + "; fullpath=" + fullPath); reference.DefaultCopyLocalValue = bool.Parse(item.GetMetadataValue("CopyLocal")); + } else if (string.Equals(assemblyName.ShortName, "mscorlib", StringComparison.OrdinalIgnoreCase)) { + LoggingService.Debug("Got information for mscorlib: " + fullPath); + mscorlibPath = fullPath; } else { LoggingService.Warn("Unknown item " + originalInclude); } diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs index 1134303ae3..6816d85cdb 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs @@ -58,6 +58,17 @@ namespace ICSharpCode.SharpDevelop // TODO: Translate me // progressMonitor.TaskName = "Resolving references for " + project.Name + "..."; project.ResolveAssemblyReferences(); + MSBuildBasedProject msbuildProject = project as MSBuildBasedProject; + if (msbuildProject != null) { + string mscorlib = msbuildProject.MscorlibPath; + if (string.IsNullOrEmpty(mscorlib)) { + AddReferencedContent(AssemblyParserService.DefaultProjectContentRegistry.Mscorlib); + } else { + AddReferencedContent(AssemblyParserService.DefaultProjectContentRegistry.GetProjectContentForReference("mscorlib", mscorlib)); + } + } else { + AddReferencedContent(AssemblyParserService.DefaultProjectContentRegistry.Mscorlib); + } foreach (ProjectItem item in items) { if (!initializing) return; // abort initialization progressMonitor.CancellationToken.ThrowIfCancellationRequested(); @@ -76,13 +87,6 @@ namespace ICSharpCode.SharpDevelop internal void ReInitialize1(IProgressMonitor progressMonitor) { - var mscorlib = AssemblyParserService.GetRegistryForReference(new ReferenceProjectItem(project, "mscorlib")).Mscorlib; - // don't fetch mscorlib within lock - finding the correct registry might access the project, causing - // a deadlock between IProject.SyncRoot and the ReferencedContents lock - lock (ReferencedContents) { - ReferencedContents.Clear(); - AddReferencedContent(mscorlib); - } // prevent adding event handler twice ProjectService.ProjectItemAdded -= OnProjectItemAdded; ProjectService.ProjectItemRemoved -= OnProjectItemRemoved; diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs index 78942dace4..75636df147 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs @@ -300,6 +300,11 @@ namespace ICSharpCode.SharpDevelop.Dom protected virtual Assembly GetDefaultAssembly(string shortName) { + return null; + /* + * Special cases disabled: using these causes us the load the GAC assemblies, + * but we need to load the reference assemblies instead to support multi-targeting. + * // These assemblies are already loaded by SharpDevelop, so we // don't need to load them in a separate AppDomain/with Cecil. switch (shortName) { @@ -332,7 +337,7 @@ namespace ICSharpCode.SharpDevelop.Dom return Assembly.Load("Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); default: return null; - } + }*/ } } }