From 0e64f8933e5d5eb925876f7d5f03743851103a61 Mon Sep 17 00:00:00 2001 From: Ryland <41491307+ryalanms@users.noreply.github.com> Date: Mon, 18 Oct 2021 16:18:26 -0700 Subject: [PATCH 1/2] Port changes from https://github.com/dotnet/wpf/pull/5426 to release/6.0 --- .../GenerateTemporaryTargetAssembly.cs | 66 ++++++++++++++----- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationBuildTasks/Microsoft/Build/Tasks/Windows/GenerateTemporaryTargetAssembly.cs b/src/Microsoft.DotNet.Wpf/src/PresentationBuildTasks/Microsoft/Build/Tasks/Windows/GenerateTemporaryTargetAssembly.cs index 500e15350a7..80a436dce22 100644 --- a/src/Microsoft.DotNet.Wpf/src/PresentationBuildTasks/Microsoft/Build/Tasks/Windows/GenerateTemporaryTargetAssembly.cs +++ b/src/Microsoft.DotNet.Wpf/src/PresentationBuildTasks/Microsoft/Build/Tasks/Windows/GenerateTemporaryTargetAssembly.cs @@ -757,29 +757,33 @@ static private void ReplaceImplicitImports(XmlDocument xmlProjectDoc) } XmlNode root = xmlProjectDoc.DocumentElement; - + for (int i = 0; i < root.Attributes.Count; i++) { XmlAttribute xmlAttribute = root.Attributes[i] as XmlAttribute; if (xmlAttribute.Name.Equals("Sdk", StringComparison.OrdinalIgnoreCase)) { - // + // + // + // + + string sdkValue = xmlAttribute.Value; + + if (!SdkReference.TryParse(sdkValue, out SdkReference sdkReference)) + return; // Remove Sdk attribute - var sdkValue = xmlAttribute.Value; root.Attributes.Remove(xmlAttribute); // // Add explicit top import // - // + // + // + // // - XmlNode nodeImportProps = xmlProjectDoc.CreateElement("Import", root.NamespaceURI); - XmlAttribute projectAttribute = xmlProjectDoc.CreateAttribute("Project"); - projectAttribute.Value = "Sdk.props"; - nodeImportProps.Attributes.Append(projectAttribute); - nodeImportProps.Attributes.Append(xmlAttribute); + XmlNode nodeImportProps = CreateImportProjectSdkNode(xmlProjectDoc, "Sdk.props", sdkReference); // Prepend this Import to the root of the XML document root.PrependChild(nodeImportProps); @@ -787,15 +791,11 @@ static private void ReplaceImplicitImports(XmlDocument xmlProjectDoc) // // Add explicit bottom import // - // + // + // + // + XmlNode nodeImportTargets = CreateImportProjectSdkNode(xmlProjectDoc, "Sdk.targets", sdkReference); // Append this Import to the end of the XML document root.AppendChild(nodeImportTargets); @@ -803,6 +803,36 @@ static private void ReplaceImplicitImports(XmlDocument xmlProjectDoc) } } + // Creates an XmlNode that contains an Import Project element + // + // + static XmlNode CreateImportProjectSdkNode(XmlDocument xmlProjectDoc, string projectAttributeValue, SdkReference sdkReference) + { + XmlNode nodeImport = xmlProjectDoc.CreateElement("Import", xmlProjectDoc.DocumentElement.NamespaceURI); + XmlAttribute projectAttribute = xmlProjectDoc.CreateAttribute("Project"); + projectAttribute.Value = projectAttributeValue; + XmlAttribute sdkAttributeProps = xmlProjectDoc.CreateAttribute("Sdk"); + sdkAttributeProps.Value = sdkReference.Name; + nodeImport.Attributes.Append(projectAttribute); + nodeImport.Attributes.Append(sdkAttributeProps); + + if (!string.IsNullOrEmpty(sdkReference.Version)) + { + XmlAttribute sdkVersionAttributeProps = xmlProjectDoc.CreateAttribute("Version"); + sdkVersionAttributeProps.Value = sdkReference.Version; + nodeImport.Attributes.Append(sdkVersionAttributeProps); + } + + if (!string.IsNullOrEmpty(sdkReference.MinimumVersion)) + { + XmlAttribute sdkVersionAttributeProps = xmlProjectDoc.CreateAttribute("MinimumVersion"); + sdkVersionAttributeProps.Value = sdkReference.MinimumVersion; + nodeImport.Attributes.Append(sdkVersionAttributeProps); + } + + return nodeImport; + } + #endregion Private Methods From c46bf6683b6d816c3088b9331e8826de7532819c Mon Sep 17 00:00:00 2001 From: ThomasGoulet73 <51839772+ThomasGoulet73@users.noreply.github.com> Date: Mon, 18 Oct 2021 19:34:50 -0400 Subject: [PATCH 2/2] WPF projects that use a versioned custom SDK fail to build (#5426) * Fix build when using and SDK that comes from a PackageReference * Update custom Sdk attribute version parsing to match msbuild * Use SdkReference.TryParse Co-authored-by: Ryland <41491307+ryalanms@users.noreply.github.com>