Browse Source

Always use MSBuild for resolving assembly references; do not special-case some .NET BCL assemblies.

This avoids loading the GAC copy of the assembly in said special cases, and loads the reference assembly for the chosen target framework version instead.
pull/20/merge
Daniel Grunwald 14 years ago
parent
commit
7c1c3b4754
  1. 6
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs
  2. 2
      src/Main/Base/Project/Src/Project/CompilableProject.cs
  3. 14
      src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
  4. 14
      src/Main/Base/Project/Src/Project/MSBuildInternals.cs
  5. 18
      src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs
  6. 7
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs

6
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs

@ -378,7 +378,8 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -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 @@ -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)) {

2
src/Main/Base/Project/Src/Project/CompilableProject.cs

@ -206,8 +206,6 @@ namespace ICSharpCode.SharpDevelop.Project @@ -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;
}

14
src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs

@ -137,9 +137,21 @@ namespace ICSharpCode.SharpDevelop.Project @@ -137,9 +137,21 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
volatile string mscorlibPath;
/// <summary>
/// Gets the path to mscorlib.
/// This property is set only after ResolveAssemblyReferences() is called.
/// </summary>
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

14
src/Main/Base/Project/Src/Project/MSBuildInternals.cs

@ -5,8 +5,8 @@ using System; @@ -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 @@ -162,7 +162,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// <param name="baseProject">The base project.</param>
/// <param name="referenceReplacements">A different set of references to use instead of those in the project.
/// Used by the GacReferencePanel.</param>
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 @@ -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);
}

18
src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs

@ -58,6 +58,17 @@ namespace ICSharpCode.SharpDevelop @@ -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 @@ -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;

7
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/ProjectContentRegistry.cs

@ -300,6 +300,11 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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 @@ -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;
}
}*/
}
}
}

Loading…
Cancel
Save