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;
- }
+ }*/
}
}
}