From 99c6e0f011c72611395a9d87a0d09ccaba3671c5 Mon Sep 17 00:00:00 2001 From: Jeremy Spedding Date: Tue, 23 Dec 2025 10:31:08 +1100 Subject: [PATCH 1/2] Fix _checkAssemblyVersionAgainstTargetFrameworkVersion logic and also add new copy logic to metaproj creation --- .../Solution/SolutionProjectGenerator.cs | 18 +++++++++++++++--- src/Tasks/AssemblyDependency/ReferenceTable.cs | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Build/Construction/Solution/SolutionProjectGenerator.cs b/src/Build/Construction/Solution/SolutionProjectGenerator.cs index e51789bbb38..1dba3144562 100644 --- a/src/Build/Construction/Solution/SolutionProjectGenerator.cs +++ b/src/Build/Construction/Solution/SolutionProjectGenerator.cs @@ -416,6 +416,8 @@ private static void AddTasksToCopyAllDependenciesIntoBinDir( string conditionDescribingValidConfigurations) { string copyLocalFilesItemName = referenceItemName + "_CopyLocalFiles"; + string resolvedDependenciesFilesItemName = referenceItemName + "_ResolvedDependencyFiles"; + string allDependentFilesItemName = referenceItemName + "_AllDependentFiles"; string targetFrameworkDirectoriesName = GenerateSafePropertyName(project, "_TargetFrameworkDirectories"); string fullFrameworkRefAssyPathName = GenerateSafePropertyName(project, "_FullFrameworkReferenceAssemblyPaths"); string destinationFolder = String.Format(CultureInfo.InvariantCulture, @"$({0})\Bin\", GenerateSafePropertyName(project, "AspNetPhysicalPath")); @@ -452,14 +454,24 @@ private static void AddTasksToCopyAllDependenciesIntoBinDir( rarTask.SetParameter("FindRelatedFiles", "true"); rarTask.SetParameter("TargetFrameworkMoniker", project.TargetFrameworkMoniker); rarTask.AddOutputItem("CopyLocalFiles", copyLocalFilesItemName, null); + rarTask.AddOutputItem("ResolvedDependencyFiles", resolvedDependenciesFilesItemName, null); - // Copy all the copy-local files (reported by RAR) to the web project's "bin" + // Merge copy-local files and resolved dependency files (reported by RAR) together + ProjectTaskInstance mergeCopyLocalToAllDependenciesTask = target.AddTask("CreateItem", null, null); + mergeCopyLocalToAllDependenciesTask.SetParameter("Include", "@(" + copyLocalFilesItemName + ")"); + mergeCopyLocalToAllDependenciesTask.AddOutputItem("Include", allDependentFilesItemName, null); + + ProjectTaskInstance mergeResolvedDependencyFileslToAllDependenciesTask = target.AddTask("CreateItem", null, null); + mergeResolvedDependencyFileslToAllDependenciesTask.SetParameter("Include", "@(" + resolvedDependenciesFilesItemName + ")"); + mergeResolvedDependencyFileslToAllDependenciesTask.AddOutputItem("Include", allDependentFilesItemName, null); + + // Copy dependencies to the web project's "bin" // directory. ProjectTaskInstance copyTask = target.AddTask("Copy", conditionDescribingValidConfigurations, null); - copyTask.SetParameter("SourceFiles", "@(" + copyLocalFilesItemName + ")"); + copyTask.SetParameter("SourceFiles", "@(" + allDependentFilesItemName + ")"); copyTask.SetParameter( "DestinationFiles", - String.Format(CultureInfo.InvariantCulture, @"@({0}->'{1}%(DestinationSubDirectory)%(Filename)%(Extension)')", copyLocalFilesItemName, destinationFolder)); + String.Format(CultureInfo.InvariantCulture, @"@({0}->'{1}%(DestinationSubDirectory)%(Filename)%(Extension)')", allDependentFilesItemName, destinationFolder)); } /// diff --git a/src/Tasks/AssemblyDependency/ReferenceTable.cs b/src/Tasks/AssemblyDependency/ReferenceTable.cs index ea9ccab8e6c..682dc672581 100644 --- a/src/Tasks/AssemblyDependency/ReferenceTable.cs +++ b/src/Tasks/AssemblyDependency/ReferenceTable.cs @@ -341,7 +341,7 @@ internal ReferenceTable( _enableCustomCulture = enableCustomCulture; // Set condition for when to check assembly version against the target framework version - _checkAssemblyVersionAgainstTargetFrameworkVersion = unresolveFrameworkAssembliesFromHigherFrameworks || ((_projectTargetFramework ?? ReferenceTable.s_targetFrameworkVersion_40) <= ReferenceTable.s_targetFrameworkVersion_40); + _checkAssemblyVersionAgainstTargetFrameworkVersion = unresolveFrameworkAssembliesFromHigherFrameworks || (_projectTargetFramework != null && (_projectTargetFramework <= s_targetFrameworkVersion_40)); // Convert the list of installed SDK's to a dictionary for faster lookup _resolvedSDKReferences = new Dictionary(StringComparer.OrdinalIgnoreCase); From 7e86c4698a5eeef6050b49baeb2d4e9c70006cd6 Mon Sep 17 00:00:00 2001 From: Jeremy Spedding Date: Tue, 23 Dec 2025 12:53:02 +1100 Subject: [PATCH 2/2] Only copy resolved dependencies when it depends on netstandard --- .../Construction/Solution/SolutionProjectGenerator.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Build/Construction/Solution/SolutionProjectGenerator.cs b/src/Build/Construction/Solution/SolutionProjectGenerator.cs index 1dba3144562..fa2fc0da6c2 100644 --- a/src/Build/Construction/Solution/SolutionProjectGenerator.cs +++ b/src/Build/Construction/Solution/SolutionProjectGenerator.cs @@ -418,6 +418,7 @@ private static void AddTasksToCopyAllDependenciesIntoBinDir( string copyLocalFilesItemName = referenceItemName + "_CopyLocalFiles"; string resolvedDependenciesFilesItemName = referenceItemName + "_ResolvedDependencyFiles"; string allDependentFilesItemName = referenceItemName + "_AllDependentFiles"; + string dependsOnNetstandardParameterName = referenceItemName + "_DependsOnNETStandard"; string targetFrameworkDirectoriesName = GenerateSafePropertyName(project, "_TargetFrameworkDirectories"); string fullFrameworkRefAssyPathName = GenerateSafePropertyName(project, "_FullFrameworkReferenceAssemblyPaths"); string destinationFolder = String.Format(CultureInfo.InvariantCulture, @"$({0})\Bin\", GenerateSafePropertyName(project, "AspNetPhysicalPath")); @@ -455,15 +456,16 @@ private static void AddTasksToCopyAllDependenciesIntoBinDir( rarTask.SetParameter("TargetFrameworkMoniker", project.TargetFrameworkMoniker); rarTask.AddOutputItem("CopyLocalFiles", copyLocalFilesItemName, null); rarTask.AddOutputItem("ResolvedDependencyFiles", resolvedDependenciesFilesItemName, null); + rarTask.AddOutputItem("DependsOnNETStandard", dependsOnNetstandardParameterName, null); // Merge copy-local files and resolved dependency files (reported by RAR) together ProjectTaskInstance mergeCopyLocalToAllDependenciesTask = target.AddTask("CreateItem", null, null); mergeCopyLocalToAllDependenciesTask.SetParameter("Include", "@(" + copyLocalFilesItemName + ")"); mergeCopyLocalToAllDependenciesTask.AddOutputItem("Include", allDependentFilesItemName, null); - ProjectTaskInstance mergeResolvedDependencyFileslToAllDependenciesTask = target.AddTask("CreateItem", null, null); - mergeResolvedDependencyFileslToAllDependenciesTask.SetParameter("Include", "@(" + resolvedDependenciesFilesItemName + ")"); - mergeResolvedDependencyFileslToAllDependenciesTask.AddOutputItem("Include", allDependentFilesItemName, null); + ProjectTaskInstance mergeResolvedDependencyFilesToAllDependenciesTask = target.AddTask("CreateItem", "'$("+ dependsOnNetstandardParameterName+")' == 'True'", null); + mergeResolvedDependencyFilesToAllDependenciesTask.SetParameter("Include", "@(" + resolvedDependenciesFilesItemName + ")"); + mergeResolvedDependencyFilesToAllDependenciesTask.AddOutputItem("Include", allDependentFilesItemName, null); // Copy dependencies to the web project's "bin" // directory.