diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
index 6e972e1cb6..c5e8eaf0bc 100644
--- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
+++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
@@ -811,6 +811,7 @@
+
diff --git a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs
index 27446a7aa1..0a97799714 100644
--- a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs
+++ b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs
@@ -7,9 +7,11 @@ using System.Linq;
using System.Text.RegularExpressions;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
+using ICSharpCode.SharpDevelop.Util;
using Microsoft.Build.Construction;
using Microsoft.Build.Execution;
using Microsoft.Build.Framework;
+using Microsoft.Build.Logging;
using MSBuild = Microsoft.Build;
using ProjectCollection = Microsoft.Build.Evaluation.ProjectCollection;
@@ -169,6 +171,7 @@ namespace ICSharpCode.SharpDevelop.Project
{
ProjectInstance project = baseProject.CreateProjectInstance();
project.SetProperty("BuildingProject", "false");
+ project.SetProperty("DesignTimeBuild", "true");
List references = (
from item in project.Items
@@ -201,9 +204,16 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
- string[] targets = { "ResolveAssemblyReferences" };
- BuildRequestData requestData = new BuildRequestData(project, targets, new HostServices());
+ List targets = new List();
+ if (baseProject.HasProjectType(ProjectTypeGuids.PortableLibrary)) {
+ targets.Add("ResolveReferences");
+ targets.Add("DesignTimeResolveAssemblyReferences");
+ } else {
+ targets.Add("ResolveAssemblyReferences");
+ }
+ BuildRequestData requestData = new BuildRequestData(project, targets.ToArray(), new HostServices());
List loggers = new List();
+ //loggers.Add(new ConsoleLogger(LoggerVerbosity.Diagnostic));
if (logErrorsToOutputPad)
loggers.Add(new SimpleErrorLogger());
lock (SolutionProjectCollectionLock) {
@@ -231,6 +241,8 @@ namespace ICSharpCode.SharpDevelop.Project
CopyLocal = bool.Parse(msbuildItem.GetMetadataValue("CopyLocal")),
ReferenceItems = referenceItems
};
+ // HACK: mscorlib is reported twice for portable library projects (even if we don't specify it as additionalReference)
+ query = query.DistinctBy(asm => asm.FullPath);
List resolvedAssemblies = new List();
List handledReferenceItems = new List();
foreach (var assembly in query) {
diff --git a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs
index 690537f4c1..e759706bab 100644
--- a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs
+++ b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs
@@ -22,6 +22,7 @@ using ICSharpCode.NRefactory;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui;
+using ICSharpCode.SharpDevelop.Util;
using WinForms = System.Windows.Forms;
namespace ICSharpCode.SharpDevelop
@@ -160,6 +161,11 @@ namespace ICSharpCode.SharpDevelop
return result;
}
+ public static IEnumerable DistinctBy(this IEnumerable input, Func keySelector)
+ {
+ return input.Distinct(KeyComparer.Create(keySelector));
+ }
+
///
/// Sets the Content property of the specified ControlControl to the specified content.
/// If the content is a Windows-Forms control, it is wrapped in a WindowsFormsHost.
diff --git a/src/Main/Base/Project/Src/Util/KeyComparer.cs b/src/Main/Base/Project/Src/Util/KeyComparer.cs
new file mode 100644
index 0000000000..4a8cce5b46
--- /dev/null
+++ b/src/Main/Base/Project/Src/Util/KeyComparer.cs
@@ -0,0 +1,45 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using System.Collections.Generic;
+
+namespace ICSharpCode.SharpDevelop.Util
+{
+ public static class KeyComparer
+ {
+ public static KeyComparer Create(Func keySelector)
+ {
+ return new KeyComparer(keySelector, Comparer.Default, EqualityComparer.Default);
+ }
+ }
+
+ public class KeyComparer : IComparer, IEqualityComparer
+ {
+ readonly Func keySelector;
+ readonly IComparer keyComparer;
+ readonly IEqualityComparer keyEqualityComparer;
+
+ public KeyComparer(Func keySelector, IComparer keyComparer, IEqualityComparer keyEqualityComparer)
+ {
+ this.keySelector = keySelector;
+ this.keyComparer = keyComparer;
+ this.keyEqualityComparer = keyEqualityComparer;
+ }
+
+ public int Compare(TElement x, TElement y)
+ {
+ return keyComparer.Compare(keySelector(x), keySelector(y));
+ }
+
+ public bool Equals(TElement x, TElement y)
+ {
+ return keyEqualityComparer.Equals(keySelector(x), keySelector(y));
+ }
+
+ public int GetHashCode(TElement obj)
+ {
+ return keyEqualityComparer.GetHashCode(keySelector(obj));
+ }
+ }
+}