Skip to content

Commit 73ede46

Browse files
committed
ILC: Allow OOB reference to upgrade framework assembly
1 parent 161f346 commit 73ede46

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

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

Lines changed: 21 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,14 @@ 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+
// Allow OOB references with higher version to take precedence over the framework assemblies.
166+
list.Add(taskItem);
167+
}
168+
158169
assembliesToSkipPublish.Add(taskItem);
159170
continue;
160171
}
@@ -196,6 +207,12 @@ public override bool Execute()
196207
SatelliteAssemblies = satelliteAssemblies.ToArray();
197208

198209
return true;
210+
211+
static Version GetFileVersion(string path)
212+
{
213+
var versionInfo = FileVersionInfo.GetVersionInfo(path);
214+
return new Version(versionInfo.FileMajorPart, versionInfo.FileMinorPart, versionInfo.FileBuildPart, versionInfo.FilePrivatePart);
215+
}
199216
}
200217
}
201218
}

0 commit comments

Comments
 (0)