Skip to content

Commit cd49b58

Browse files
github-actions[bot]sbomerjeffschwMSFT
authored
[release/8.0-staging] ILC: Allow OOB reference to upgrade framework assembly (#110059)
* ILC: Allow OOB reference to upgrade framework assembly * Log error for SPC --------- Co-authored-by: Sven Boemer <[email protected]> Co-authored-by: Jeff Schwartz <[email protected]>
1 parent 5996804 commit cd49b58

File tree

1 file changed

+28
-4
lines changed

1 file changed

+28
-4
lines changed

src/coreclr/tools/aot/ILCompiler.Build.Tasks/ComputeManagedAssembliesToCompileToNative.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.Build.Utilities;
66
using System;
77
using System.Collections.Generic;
8+
using System.Diagnostics;
89
using System.IO;
910
using System.Reflection.Metadata;
1011
using System.Reflection.PortableExecutable;
@@ -99,16 +100,20 @@ public override bool Execute()
99100
var list = new List<ITaskItem>();
100101
var assembliesToSkipPublish = new List<ITaskItem>();
101102
var satelliteAssemblies = new List<ITaskItem>();
102-
var nativeAotFrameworkAssembliesToUse = new HashSet<string>();
103+
var nativeAotFrameworkAssembliesToUse = new Dictionary<string, ITaskItem>();
103104

104105
foreach (ITaskItem taskItem in SdkAssemblies)
105106
{
106-
nativeAotFrameworkAssembliesToUse.Add(Path.GetFileName(taskItem.ItemSpec));
107+
var fileName = Path.GetFileName(taskItem.ItemSpec);
108+
if (!nativeAotFrameworkAssembliesToUse.ContainsKey(fileName))
109+
nativeAotFrameworkAssembliesToUse.Add(fileName, taskItem);
107110
}
108111

109112
foreach (ITaskItem taskItem in FrameworkAssemblies)
110113
{
111-
nativeAotFrameworkAssembliesToUse.Add(Path.GetFileName(taskItem.ItemSpec));
114+
var fileName = Path.GetFileName(taskItem.ItemSpec);
115+
if (!nativeAotFrameworkAssembliesToUse.ContainsKey(fileName))
116+
nativeAotFrameworkAssembliesToUse.Add(fileName, taskItem);
112117
}
113118

114119
foreach (ITaskItem taskItem in Assemblies)
@@ -153,8 +158,21 @@ public override bool Execute()
153158

154159
// Remove any assemblies whose implementation we want to come from NativeAOT's package.
155160
// Currently that's System.Private.* SDK assemblies and a bunch of framework assemblies.
156-
if (nativeAotFrameworkAssembliesToUse.Contains(assemblyFileName))
161+
if (nativeAotFrameworkAssembliesToUse.TryGetValue(assemblyFileName, out ITaskItem frameworkItem))
157162
{
163+
if (GetFileVersion(itemSpec).CompareTo(GetFileVersion(frameworkItem.ItemSpec)) > 0)
164+
{
165+
if (assemblyFileName == "System.Private.CoreLib.dll")
166+
{
167+
Log.LogError($"Overriding System.Private.CoreLib.dll with a newer version is not supported. Attempted to use {itemSpec} instead of {frameworkItem.ItemSpec}.");
168+
}
169+
else
170+
{
171+
// Allow OOB references with higher version to take precedence over the framework assemblies.
172+
list.Add(taskItem);
173+
}
174+
}
175+
158176
assembliesToSkipPublish.Add(taskItem);
159177
continue;
160178
}
@@ -196,6 +214,12 @@ public override bool Execute()
196214
SatelliteAssemblies = satelliteAssemblies.ToArray();
197215

198216
return true;
217+
218+
static Version GetFileVersion(string path)
219+
{
220+
var versionInfo = FileVersionInfo.GetVersionInfo(path);
221+
return new Version(versionInfo.FileMajorPart, versionInfo.FileMinorPart, versionInfo.FileBuildPart, versionInfo.FilePrivatePart);
222+
}
199223
}
200224
}
201225
}

0 commit comments

Comments
 (0)