From 096c91e094ec27254000e4a447d308cd3442b209 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Mon, 6 Aug 2007 10:42:07 +0000 Subject: [PATCH] Add "RequiredTargetFramework" meta data to references. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2633 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/ToolboxProvider.cs | 1 - .../ReferenceDialog/AssemblyReferencePanel.cs | 1 - .../ReferenceDialog/GacReferencePanel.cs | 95 ++++++++++++++++++- .../Src/Project/Items/ReferenceProjectItem.cs | 15 ++- .../Project/Src/Project/MSBuildInternals.cs | 5 +- 5 files changed, 107 insertions(+), 10 deletions(-) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ToolboxProvider.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ToolboxProvider.cs index 67193d7024..a47eae2176 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ToolboxProvider.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/ToolboxProvider.cs @@ -209,7 +209,6 @@ namespace ICSharpCode.FormsDesigner } else { reference.Include = referenceName.FullName; reference.HintPath = FileUtility.GetRelativePath(project.Directory, toolComponent.FileName); - reference.SpecificVersion = false; LoggingService.Debug("Added assembly reference to project: " + reference.Include); } ProjectService.AddProjectItem(project, reference); diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/AssemblyReferencePanel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/AssemblyReferencePanel.cs index 668b41c48c..c65f28bf2f 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/AssemblyReferencePanel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/AssemblyReferencePanel.cs @@ -45,7 +45,6 @@ namespace ICSharpCode.SharpDevelop.Gui ReferenceProjectItem assemblyReference = new ReferenceProjectItem(selectDialog.ConfigureProject); assemblyReference.Include = Path.GetFileNameWithoutExtension(file); assemblyReference.HintPath = FileUtility.GetRelativePath(selectDialog.ConfigureProject.Directory, file); - assemblyReference.SpecificVersion = false; selectDialog.AddReference( Path.GetFileName(file), "Assembly", file, 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 9071ae2550..80efee7667 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/GacReferencePanel.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading; using System.Windows.Forms; @@ -107,9 +108,15 @@ namespace ICSharpCode.SharpDevelop.Gui public void AddReference() { foreach (ListViewItem item in listView.SelectedItems) { + string include = chooseSpecificVersionCheckBox.Checked ? item.Tag.ToString() : item.Text; + ReferenceProjectItem rpi = new ReferenceProjectItem(selectDialog.ConfigureProject, include); + string requiredFrameworkVersion; + if (fullAssemblyNameToRequiredFrameworkVersionDictionary.TryGetValue(item.Tag.ToString(), out requiredFrameworkVersion)) { + rpi.SetMetadata("RequiredTargetFramework", requiredFrameworkVersion); + } selectDialog.AddReference( - item.Text, "Gac", item.Tag.ToString(), - new ReferenceProjectItem(selectDialog.ConfigureProject, item.Tag.ToString()) + item.Text, "Gac", rpi.Include, + rpi ); } } @@ -148,7 +155,7 @@ namespace ICSharpCode.SharpDevelop.Gui } if (!isDuplicate) { ListViewItem item = new ListViewItem(new string[] {asm.ShortName, asm.Version}); - item.Tag = asm.ShortName; + item.Tag = asm.FullName; itemList.Add(item); } } @@ -205,6 +212,88 @@ namespace ICSharpCode.SharpDevelop.Gui }); } + readonly static Dictionary fullAssemblyNameToRequiredFrameworkVersionDictionary = new Dictionary { + { "PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "System.Printing, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "Microsoft.Build.Conversion.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" }, + { "Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" }, + { "Microsoft.Build.Framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" }, + { "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" }, + { "Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" }, + { "Microsoft.VisualC.STLCLR, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" }, + { "policy.1.0.System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" }, + { "policy.1.0.System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" }, + { "PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "PresentationFramework.Classic, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "PresentationFramework.Luna, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "PresentationFramework.Royale, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "PresentationUI, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "ReachFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "System.AddIn, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" }, + { "System.AddIn.Contract, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" }, + { "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" }, + { "System.Data.DataSetExtensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" }, + { "System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" }, + { "System.DirectoryServices.AccountManagement, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" }, + { "System.Management.Instrumentation, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" }, + { "System.Net, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" }, + { "System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" }, + { "System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" }, + { "System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" }, + { "System.Windows.Presentation, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" }, + { "System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" }, + { "System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" }, + { "UIAutomationProvider, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "UIAutomationTypes, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }, + { "WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" } + }; + + #if DEBUG + /// + /// run this method with a .net 3.5 project to generate the table above. + /// + void CreateReferenceToFrameworkTable() + { + MSBuildBasedProject project = selectDialog.ConfigureProject as MSBuildBasedProject; + if (project == null) + return; + + var redistNameToRequiredFramework = new Dictionary { + { "Framework", null }, + { "Microsoft-Windows-CLRCoreComp", null }, + { "Microsoft.VisualStudio.Primary.Interop.Assemblies.8.0", null }, + { "Microsoft-WinFX-Runtime", "3.0" }, + { "Microsoft-Windows-CLRCoreComp-v3.5", "3.5" } + }; + + using (StreamWriter w = new StreamWriter("c:\\temp\\references.txt")) { + List referenceItems = new List(); + WorkbenchSingleton.SafeThreadCall( + delegate { + foreach (ListViewItem item in fullItemList) { + referenceItems.Add(new ReferenceProjectItem(project, item.Tag.ToString())); + } + }); + + MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray()); + foreach (ReferenceProjectItem rpi in referenceItems) { + if (string.IsNullOrEmpty(rpi.Redist)) continue; + if (!redistNameToRequiredFramework.ContainsKey(rpi.Redist)) { + throw new Exception("unknown redist: " + rpi.Redist); + } + if (redistNameToRequiredFramework[rpi.Redist] != null) { + w.Write("\t\t\t{ \""); + w.Write(rpi.Include); + w.Write("\", \""); + w.Write(redistNameToRequiredFramework[rpi.Redist]); + w.WriteLine("\" },"); + } + } + } + } + #endif + protected virtual IList GetCacheContent() { List list = GacInterop.GetAssemblyList(); diff --git a/src/Main/Base/Project/Src/Project/Items/ReferenceProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ReferenceProjectItem.cs index f896a6f849..13934db142 100644 --- a/src/Main/Base/Project/Src/Project/Items/ReferenceProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/ReferenceProjectItem.cs @@ -66,11 +66,18 @@ namespace ICSharpCode.SharpDevelop.Project Description = "${res:ICSharpCode.SharpDevelop.Internal.Project.ProjectReference.SpecificVersion.Description}")] public bool SpecificVersion { get { - return GetEvaluatedMetadata("SpecificVersion", false); - } - set { - SetEvaluatedMetadata("SpecificVersion", value); + return this.Include.Contains(","); } + /* set { + if (this.SpecificVersion == value) + return; + if (value) { + this.Include = this.AssemblyName.FullName; + } else { + this.Include = this.AssemblyName.ShortName; + Ensure that reference still resolves to the same assembly + } + } */ } internal const string CopyLocalMetadataName = "Private"; diff --git a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs index a64c00ca15..01bd962f5a 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs @@ -334,6 +334,7 @@ namespace ICSharpCode.SharpDevelop.Project } else { references = referenceReplacements; + // replace all references in the project with the referenceReplacements foreach (MSBuild.BuildItemGroup itemGroup in tempProject.ItemGroups) { foreach (MSBuild.BuildItem item in itemGroup.ToArray()) { if (item.Name == ItemType.Reference.ItemName) { @@ -348,7 +349,9 @@ namespace ICSharpCode.SharpDevelop.Project } var referenceDict = references.ToDictionary(item => item.Include); - engine.RegisterLogger(new MSBuild.ConsoleLogger(Microsoft.Build.Framework.LoggerVerbosity.Detailed)); + #if DEBUG + //engine.RegisterLogger(new MSBuild.ConsoleLogger(Microsoft.Build.Framework.LoggerVerbosity.Detailed)); + #endif //Environment.CurrentDirectory = Path.GetDirectoryName(tempProject.FullFileName); if (!tempProject.Build("ResolveAssemblyReferences")) {