如何让 FSI 在 NET5 下工作并让愚蠢的 stackoverflow 消息 "Title cannot contain ..." 闭嘴?

How to make FSI work under NET5 and make stupid stackoverflow message "Title cannot contain ..." shut up?

我正在将一个相当小的 F# 项目从 Net Framework 迁移到 NET5。迁移非常简单,一切正常,包括测试。

但是,当我 运行 一些脚本时,我现在收到以下错误:


Microsoft (R) F# Interactive version 11.0.0.0 for F# 5.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

> 
[Loading C:\Users\kkkma\AppData\Local\Temp\nuget772--091a5e4a-2a27-4d4d-9891-2b58055c5317\Project.fsproj.fsx
 Loading C:\GitHub\Berreman\Berreman\Analytics\Examples\References.fsx]
namespace FSI_0002.Project

namespace FSI_0002

[Loading C:\Users\kkkma\AppData\Local\Temp\nuget772--091a5e4a-2a27-4d4d-9891-2b58055c5317\Project.fsproj.fsx]
namespace FSI_0003.Project

Binding session to 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.dll'...
Binding session to 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Numerics.dll'...
System.TypeLoadException: Could not load type 'System.ICloneable' from assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
   at Berreman.MathNetNumericsMath.complexDiagonalMatrix(Int32 n, Complex e)
   at Berreman.Geometry.complexIdentityMatrix(Int32 n) in C:\GitHub\Berreman\Berreman\Berreman\Geometry.fs:line 17
   at Berreman.Geometry.ComplexMatrix3x3.get_identity() in C:\GitHub\Berreman\Berreman\Berreman\Geometry.fs:line 307
   at Berreman.MaterialProperties.Eps.fromRefractionIndex(RefractionIndex _arg1) in C:\GitHub\Berreman\Berreman\Berreman\MaterialProperties.fs:line 70
   at FSI_0004.opticalProperties(RefractionIndex refractionIndex) in C:\GitHub\Berreman\Berreman\Analytics\Examples\Glass_01.fsx:line 51
   at FSI_0004.getGlassInfo(Boolean useThickPlate, RefractionIndexThickness nh1, FSharpOption`1 nh2Opt, IncidentLightInfo light) in C:\GitHub\Berreman\Berreman\Analytics\Examples\Glass_01.fsx:line 61
   at <StartupCode$FSI_0004>.$FSI_0004.main@() in C:\GitHub\Berreman\Berreman\Analytics\Examples\Glass_01.fsx:line 98
Stopped due to error
> 

当我从 C:\Users\kkkma\AppData\Local\Temp\nuget772--091a5e4a-2a27-4d4d-9891-2b58055c5317 检查 Project.fsproj.resolvedReferences.paths 时(这是 FSI 在我 运行 脚本时创建的文件夹)我看到它从 C:\Users\kkkma\.nuget\packages\microsoft.netframework.referenceassemblies.net48.0.0\build\.NETFramework\v4.8\Facades\System.Runtime.InteropServices.RuntimeInformation.dll 开始并且它还有一些其他 Net Framework 解析的引用。这让我相信 FSI 以某种方式“决定”使用 Net Framework 而不是 NET 5。

文件fsi.runtimeconfig.json包含正确的信息:

{
  "runtimeOptions": {
    "tfm": "net5.0",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "5.0.0"
    }
  }
}

有谁知道如何强制 FSI 选择 NET 5 而不是 Net Framework?

自 Visual Studio 2019 version 16.9 起,您可以启用一个选项以使用 dotnet fsi 到 运行 交互式 F# 脚本。这适用于 .NET 5 代码。

这是通过“工具”>“选项”>“F# 工具”>“F# 交互”>“使用 .NET Core 脚本”设置的。

可在 https://devblogs.microsoft.com/dotnet/f-and-f-tools-update-for-visual-studio-16-9/

找到完整的详细信息和说明