From 0f373f0bee91dc6d8c89ce5caa8ccfc72cc7bed6 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Mon, 30 Nov 2020 21:53:54 -0800 Subject: [PATCH] Fix net sdk references discovery (#10569) * Fix net sdk references discovery * Do numbers properly * version filter --- src/fsharp/CompilerConfig.fs | 2 -- src/fsharp/DotNetFrameworkDependencies.fs | 22 +++++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/fsharp/CompilerConfig.fs b/src/fsharp/CompilerConfig.fs index b77e0361cdd..4a324ab7097 100644 --- a/src/fsharp/CompilerConfig.fs +++ b/src/fsharp/CompilerConfig.fs @@ -877,8 +877,6 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) = #endif None, data.legacyReferenceResolver.HighestInstalledNetFrameworkVersion() - let systemAssemblies = systemAssemblies - member x.primaryAssembly = data.primaryAssembly member x.noFeedback = data.noFeedback member x.stackReserveSize = data.stackReserveSize diff --git a/src/fsharp/DotNetFrameworkDependencies.fs b/src/fsharp/DotNetFrameworkDependencies.fs index cc3cc0800fb..de7ecda89b5 100644 --- a/src/fsharp/DotNetFrameworkDependencies.fs +++ b/src/fsharp/DotNetFrameworkDependencies.fs @@ -29,7 +29,7 @@ module internal FSharp.Compiler.DotNetFrameworkDependencies location let inline ifEmptyUse alternative filename = if String.IsNullOrWhiteSpace filename then alternative else filename - + let getFSharpCoreLibraryName = "FSharp.Core" let getFsiLibraryName = "FSharp.Compiler.Interactive.Settings" let getDefaultFSharpCoreLocation = Path.Combine(fSharpCompilerLocation, getFSharpCoreLibraryName + ".dll") @@ -62,15 +62,27 @@ module internal FSharp.Compiler.DotNetFrameworkDependencies // packs\Microsoft.NETCore.App.Ref\sdk-version\netcoreappn.n // we will rely on the sdk-version match on the two paths to ensure that we get the product that ships with the // version of the runtime we are executing on - // Use the reference assemblies for the highest netcoreapp tfm that we find in that location. + // Use the reference assemblies for the highest netcoreapp tfm that we find in that location that is + // lower than or equal to the implementation version. + let zeroVersion = Version("0.0.0.0") let version, frameworkRefsPackDirectoryRoot = try - let version = DirectoryInfo(implementationAssemblyDir).Name + let computeVersion version = + match Version.TryParse(version) with + | true, v -> v + | false, _ -> zeroVersion + + let version = computeVersion (DirectoryInfo(implementationAssemblyDir).Name) let microsoftNETCoreAppRef = Path.Combine(implementationAssemblyDir, "../../../packs/Microsoft.NETCore.App.Ref") if Directory.Exists(microsoftNETCoreAppRef) then - Some version, Some microsoftNETCoreAppRef + let directory = DirectoryInfo(microsoftNETCoreAppRef).GetDirectories() + |> Array.map (fun di -> computeVersion di.Name) + |> Array.sort + |> Array.filter(fun v -> v <= version) + |> Array.last + Some (directory.ToString()), Some microsoftNETCoreAppRef else - Some version, None + None, None with | _ -> None, None // Tries to figure out the tfm for the compiler instance.