新版本中的匿名记录
我有两个版本的私有库:Proxy.1.1.5.dll
和Proxy.2.0.0.dll
。 较新的使用 F# 匿名记录。其他差异并不那么重要(我猜(。
等于VS2019
构建 config
这两个版本都是由安装了Visual Studio 2019
的GitHub
托管服务器基于同一脚本构建并发布到专用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都可以用作依赖项来编译过时VS2017
Models
项目,只是因为它.dll
而不是.fs
编译它们的源代码。.dll包含纯IL
代码,匿名记录在编译期间(因此在创建.dll之前(被编译器生成的类替换。
问题
- 这怎么可能?
- 它真的选择了仅基于代码本身的
F#
编译器版本,尽管在两种情况下环境条件相同? - 如何在不在本地计算机上安装
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# 相关的元数据的 dll,以便对 F# 对象进行特殊处理。您应该能够很好地使用 C# 中的这些 dll。但旧的 F# 编译器无法理解新的 F# 编译器生成的元数据。
- [不明白问题。
- 为什么现在要使用VS2017?删除元数据可能会启用 VS2017 生成,但你将无法以与需要 F# 到 F# 理解的功能相同的方式编译依赖项目,这样这些功能将无法在项目之间工作。