@@ -41,62 +41,52 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver
4141// ATTENTION!: the following code needs to be updated every time we are switching to the new MSBuild version because new .NET framework version was released
4242// 1. List of frameworks
4343// 2. DeriveTargetFrameworkDirectoriesFor45Plus
44- // 3.HighestInstalledNetFrameworkVersion
44+ // 3.HighestInstalledRefAssembliesOrDotNETFramework
4545// 4. GetPathToDotNetFrameworkImlpementationAssemblies
4646[<Literal>]
47- let private Net10 = " v1.0 "
47+ let private Net45 = " v4.5 "
4848
4949[<Literal>]
50- let private Net11 = " v1 .1"
50+ let private Net451 = " v4.5 .1"
5151
5252[<Literal>]
53- let private Net20 = " v2.0 "
53+ let private Net452 = " v4.5.2 " // not available in Dev15 MSBuild version
5454
5555[<Literal>]
56- let private Net30 = " v3.0 "
56+ let private Net46 = " v4.6 "
5757
5858[<Literal>]
59- let private Net35 = " v3.5 "
59+ let private Net461 = " v4.6.1 "
6060
6161[<Literal>]
62- let private Net40 = " v4.0 "
62+ let private Net462 = " v4.6.2 "
6363
6464[<Literal>]
65- let private Net45 = " v4.5 "
65+ let private Net47 = " v4.7 "
6666
6767[<Literal>]
68- let private Net451 = " v4.5.1"
69-
70- /// The list of supported .NET Framework version numbers, using the monikers of the Reference Assemblies folder.
71- let SupportedNetFrameworkVersions = set[ Net20; Net30; Net35; Net40; Net45; Net451; (* SL only*) " v5.0" ]
72-
73- //[<Literal>]
74- //let private Net452 = "v4.5.2" // not available in Dev15 MSBuild version
68+ let private Net471 = " v4.7.1"
7569
76- #if MSBUILD_ AT_ LEAST_ 14
7770[<Literal>]
78- let private Net46 = " v4.6 "
71+ let private Net472 = " v4.7.2 "
7972
80- [<Literal>]
81- let private Net461 = " v4.6.1"
82- #endif
73+ let SupportedDesktopFrameworkVersions = [ Net472; Net471; Net47; Net462; Net461; Net46; Net452; Net451; Net45]
8374
84- /// Get the path to the .NET Framework implementation assemblies by using ToolLocationHelper.GetPathToDotNetFramework.
75+ /// Get the path to the .NET Framework implementation assemblies by using ToolLocationHelper.GetPathToDotNetFramework
8576/// This is only used to specify the "last resort" path for assembly resolution.
8677let GetPathToDotNetFrameworkImlpementationAssemblies ( v ) =
8778let v =
8879match vwith
89- | Net11-> Some TargetDotNetFrameworkVersion.Version11
90- | Net20-> Some TargetDotNetFrameworkVersion.Version20
91- | Net30-> Some TargetDotNetFrameworkVersion.Version30
92- | Net35-> Some TargetDotNetFrameworkVersion.Version35
93- | Net40-> Some TargetDotNetFrameworkVersion.Version40
9480| Net45-> Some TargetDotNetFrameworkVersion.Version45
9581| Net451-> Some TargetDotNetFrameworkVersion.Version451
96- #if MSBUILD _ AT _ LEAST _ 14
97- // | Net452 -> Some TargetDotNetFrameworkVersion.Version452 // not available in Dev15 MSBuild version
82+ #if MSBUILD _ AT _ LEAST _ 15
83+ | Net452-> Some TargetDotNetFrameworkVersion.Version452
9884| Net46-> Some TargetDotNetFrameworkVersion.Version46
9985| Net461-> Some TargetDotNetFrameworkVersion.Version461
86+ | Net462-> Some TargetDotNetFrameworkVersion.Version462
87+ | Net47-> Some TargetDotNetFrameworkVersion.Version47
88+ | Net471-> Some TargetDotNetFrameworkVersion.Version471
89+ | Net472-> Some TargetDotNetFrameworkVersion.Version472
10090#endif
10191| _ -> assert false ; None
10292match vwith
@@ -106,7 +96,6 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver
10696| x-> [ x]
10797| _ -> []
10898
109-
11099let GetPathToDotNetFrameworkReferenceAssemblies ( version ) =
111100#if NETSTANDARD1_ 6|| NETSTANDARD2_ 0
112101 ignore version
@@ -118,41 +107,59 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver
118107| x-> [ x]
119108#endif
120109
121- /// Use MSBuild to determine the version of the highest installed framework.
122- let HighestInstalledNetFrameworkVersion () =
123- try
124- #if MSBUILD_ AT_ LEAST_ 14
125- if box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version461)) <> null then Net461
126- elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version46)) <> null then Net46
127- // 4.5.2 enumeration is not available in Dev15 MSBuild version
128- //elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version452)) <> null then Net452
129- elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version451)) <> null then Net451
110+ /// Use MSBuild to determine the version of the highest installed set of reference assemblies, failing that grab the highest installed framework version
111+ let HighestInstalledRefAssembliesOrDotNETFramework () =
112+ let getHighestInstalledDotNETFramework () =
113+ try
114+ // The Mono build still uses an ancient version of msbuild from around Dev 14
115+ #if MSBUILD_ AT_ LEAST_ 15
116+ if box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version472)) <> null then Net472
117+ elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version471)) <> null then Net471
118+ elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version47)) <> null then Net47
119+ elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version462)) <> null then Net462
120+ elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version461)) <> null then Net461
121+ elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version461)) <> null then Net461
122+ elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version46)) <> null then Net46
123+ elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version452)) <> null then Net452
124+ elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version451)) <> null then Net451
130125#else
131- if box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version451)) <> null then Net451
126+ if box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version451)) <> null then Net451
127+ #endif
128+ elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version45)) <> null then Net45
129+ else Net45// version is 4.5 assumed since this code is running.
130+ with _ -> Net45
131+
132+ #if ! FX_ RESHAPED_ REFLECTION
133+ // 1. First look to see if we can find the highest installed set of dotnet reference assemblies, if yes then select that framework
134+ // 2. Otherwise ask msbuild for the highestinstalled framework
135+ let checkFrameworkForReferenceAssemblies ( dotNetVersion : string ) =
136+ if not ( String.IsNullOrEmpty( dotNetVersion)) then
137+ try
138+ let v = if dotNetVersion.StartsWith( " v" ) then dotNetVersion.Substring( 1 ) else dotNetVersion
139+ let frameworkName = new System.Runtime.Versioning.FrameworkName( " .NETFramework" , new Version( v))
140+ match ToolLocationHelper.GetPathToReferenceAssemblies( frameworkName) |> Seq.tryHeadwith
141+ | Some p-> if Directory.Exists( p) then true else false
142+ | None-> false
143+ with _ -> false
144+ else false
145+ match SupportedDesktopFrameworkVersions|> Seq.tryFind( fun v -> checkFrameworkForReferenceAssemblies v) with
146+ | Some v-> v
147+ | None-> getHighestInstalledDotNETFramework()
148+ #else
149+ getHighestInstalledDotNETFramework()
132150#endif
133- elif box( ToolLocationHelper.GetPathToDotNetFramework( TargetDotNetFrameworkVersion.Version45)) <> null then Net45
134- else Net45// version is 4.5 assumed since this code is running.
135- with _ -> Net45
136151
137- /// Derive the target framework directories.
152+ /// Derive the target framework directories.
138153let DeriveTargetFrameworkDirectories ( targetFrameworkVersion : string , logMessage ) =
139154
140155let targetFrameworkVersion =
141156if not ( targetFrameworkVersion.StartsWith( " v" , StringComparison.Ordinal)) then " v" + targetFrameworkVersion
142157else targetFrameworkVersion
143158
144- let result =
145- if targetFrameworkVersion.StartsWith( Net10, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([ @" {WindowsFramework}\v1.0.3705" ])
146- elif targetFrameworkVersion.StartsWith( Net11, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([ @" {WindowsFramework}\v1.1.4322" ])
147- elif targetFrameworkVersion.StartsWith( Net20, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([ @" {WindowsFramework}\v2.0.50727" ])
148- elif targetFrameworkVersion.StartsWith( Net30, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([ @" {ReferenceAssemblies}\v3.0" ; @" {WindowsFramework}\v3.0" ; @" {WindowsFramework}\v2.0.50727" ])
149- elif targetFrameworkVersion.StartsWith( Net35, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([ @" {ReferenceAssemblies}\v3.5" ; @" {WindowsFramework}\v3.5" ; @" {ReferenceAssemblies}\v3.0" ; @" {WindowsFramework}\v3.0" ; @" {WindowsFramework}\v2.0.50727" ])
150- else GetPathToDotNetFrameworkReferenceAssemblies( targetFrameworkVersion)
151-
152- let result = result|> Array.ofList
153- logMessage( sprintf" Derived target framework directories for version%s are:%s " targetFrameworkVersion( String.Join( " ," , result)))
159+ let result = GetPathToDotNetFrameworkReferenceAssemblies( targetFrameworkVersion) |> Array.ofList
160+ logMessage( sprintf" Derived target framework directories for version%s are:%s " targetFrameworkVersion( String.Join( " ," , result)))
154161 result
155-
162+
156163/// Describes the location where the reference was found, used only for debug and tooltip output
157164type ResolvedFrom =
158165| AssemblyFolders
@@ -364,7 +371,7 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver
364371
365372let Resolver =
366373{ new ReferenceResolver.Resolverwith
367- member __.HighestInstalledNetFrameworkVersion () = HighestInstalledNetFrameworkVersion ()
374+ member __.HighestInstalledNetFrameworkVersion () = HighestInstalledRefAssembliesOrDotNETFramework ()
368375member __.DotNetFrameworkReferenceAssembliesRootDirectory = DotNetFrameworkReferenceAssembliesRootDirectory
369376
370377/// Perform the resolution on rooted and unrooted paths, and then combine the results.