由于VS2017中的F#编译器过时,无法使用.dll库



新版本中的匿名记录
我有两个版本的私有库:Proxy.1.1.5.dllProxy.2.0.0.dll。 较新的使用 F# 匿名记录。其他差异并不那么重要(我猜(。

等于VS2019构建 config
这两个版本都是由安装了Visual Studio 2019GitHub托管服务器基于同一脚本构建并发布到专用NuGet源的,因此初始条件相同。没有警告。

VS2017上的

F# 编译器版本错误
Models项目使用Proxy.1.1.5包(纯.dll,无源(。它通过Visual Studio 2017我的本地机器完美构建。但是,由于以下原因,Proxy.2.0.0它无法编译:

error FS0229: Error opening binary file 
'C:ProjectsDashboard.WPFpackagesProxy.2.0.0libnet462Proxy.dll':
Error reading/writing metadata for the F# compiled DLL 
'C:ProjectsDashboard.WPFpackagesProxy.2.0.0libnet462Proxy.dll'.
Was the DLL compiled with an earlier version of the F# compiler? (
error: 'lookup_uniq in table istrings out of range, n = 110, sizeof(tab) = 6').

显然,不是更早的版本,而是更新的版本

>预期行为
F#版本在我的Visual Studio 2017不支持匿名记录。 但我希望任何.dll都可以用作依赖项来编译过时VS2017Models项目,只是因为它.dll而不是.fs编译它们的源代码。.dll包含纯IL代码,匿名记录在编译期间(因此在创建.dll之前(被编译器生成的类替换。

问题

  1. 这怎么可能?
  2. 它真的选择了仅基于代码本身的F#编译器版本,尽管在两种情况下环境条件相同?
  3. 如何在不在本地计算机上安装Visual Studio 2019的情况下Proxy.2.0.0.dll版本构建依赖项目Models
    3.1。fsc.exe --nointerfacedata能帮忙吗?

    指示编译器省略它通常添加到包含特定于 F# 的元数据的程序体的资源。

不幸的是,无法从不理解匿名记录的旧编译器中使用这样的.dll。这是因为该功能已添加到 F# 元数据格式,每当使用该功能将新的(相对于旧编译器(元数据写入元数据 blob 时,该功能都会破坏向前兼容性。从支持的角度来看,向前兼容性是首选,但不能保证。

这是支持的:

  • 新的编译器可以使用较旧的编译器生成的二进制文件
  • 新的编译器可以依赖于较旧的FSharp.Core
  • 新的编译器可以与较旧的FSharp.Core重新绑定,而无需重新编译
  • 旧的编译器可以依赖于较新的FSharp.Core
  • 旧的编译器可以与较新的FSharp.Core重新绑定,而无需重新编译

这是经常有效的方法,但不能保证有效:

  • 旧的编译器可以使用较新的编译器生成的二进制文件
  • 旧的编译器可以使用较新的FSharp.Core 中的所有构造

注意:这假定 F# post-.NET 框架 3.5。将 F# 与旧版本的 .NET Framework 配合使用有一些特殊的注意事项。

最后两点不能保证有效的原因是,可能存在一个新概念,对于旧的编译器来说,这个概念从根本上是不可能理解的。一个这样的例子是 FSharp.Core 4.5.2 或更高版本中的voidptr类型。这是一个新的原语,旧的编译器无法正确解释。

不幸的是,每当使用功能涉及以旧编译器无法理解的方式写入元数据格式时,这就会变得令人困惑。编译器错误可能应该得到改进。

F#
  1. 分析与 F# 相关的元数据的 dll,以便对 F# 对象进行特殊处理。您应该能够很好地使用 C# 中的这些 dll。但旧的 F# 编译器无法理解新的 F# 编译器生成的元数据。
  2. [不明白问题。
  3. 为什么现在要使用VS2017?删除元数据可能会启用 VS2017 生成,但你将无法以与需要 F# 到 F# 理解的功能相同的方式编译依赖项目,这样这些功能将无法在项目之间工作。

最新更新