.net 什么是F#';s FSharp.Core.optdata和FSharp.Core.sigdata文件?

.net 什么是F#';s FSharp.Core.optdata和FSharp.Core.sigdata文件?,.net,f#,.net,F#,这两个文件似乎与FSharp.Core.dll一起位于F#的目录中。 如果忘记将这两个文件与FSharp.Core.dll放在一起,那么这两个文件似乎都是一个不断的麻烦源。 它们似乎是二进制文件,所以我无法揭示它们的用途 我在谷歌上搜索了两个文件,但似乎没有一个明确的答案来回答我的问题。那么..它们在F#中的作用是什么 Optdata绝对是优化数据,它是作为编译器中EncodeOptimizationData函数的一部分编写的FSharp.Core将此信息存储在外部文件中,而不是嵌入到资源清单中

这两个文件似乎与FSharp.Core.dll一起位于F#的目录中。 如果忘记将这两个文件与FSharp.Core.dll放在一起,那么这两个文件似乎都是一个不断的麻烦源。 它们似乎是二进制文件,所以我无法揭示它们的用途


我在谷歌上搜索了两个文件,但似乎没有一个明确的答案来回答我的问题。那么..它们在F#中的作用是什么

Optdata绝对是优化数据,它是作为编译器中
EncodeOptimizationData
函数的一部分编写的
FSharp.Core
将此信息存储在外部文件中,而不是嵌入到资源清单中

sigdata使用
EncodeInterfaceData
编码,并包含有关F#类型的签名/接口的信息
FSharp.Core
FSharp.Compiler.Silverlight
FSharp.LanguageService.Compiler
都将此信息存储在外部文件中,而不是嵌入到资源清单中

由于
FSharp.Core
的资源清单中不包含这两项,因此它们必须在外部显示,但我不确定这是什么原因


用户生成的F#文件在编译时,将这些信息编码到资源清单中,如果查看元数据,您可以看到这一点。

我认为它与优化数据有关,可能会被
--nooptimizationdata
抑制,但这似乎不正确。如果没有这两个文件,我的应用程序就会崩溃,所以我将它们放在输出目录中。我尝试使用该标志运行它,但没有文件,它再次崩溃(这些太奇怪了。我刚刚制作了一个包含FSharp.Core.dll的F#NuGet包。如果该包用于F#library项目,则除非包含.sigdata和.optdata文件(在NuGet包中),否则该项目将无法编译。)。但是,库的发布目录中只包含FSharp.Core.dll而不包含sig/optdata文件,没有它们一切都可以正常运行。在这种情况下,.sigdata文件似乎只在编译期间需要。sigdata文件似乎包含对某些.fsi文件的引用,.optdata文件似乎引用了.fs文件和具体类型但不知道他们的目的是什么:(可能是优化,正如其他人所说。有许多F#type系统功能无法直接在CLR上表达——比如类型是有区别的联合类型还是记录类型、内联定义和静态解析的类型参数,以及有关函数如何使用的信息(例如,
let F(x,y))z=x+y+z
可能被编译成一个具有三个参数的方法,但从F#开始,它需要看起来接受一个元组和另一个curried参数。对。换句话说,
SigData
optidata
总是作为托管资源编译成F#程序集,除非您指定像
--nooptimizationdata
这样的标志“我不知道为什么,但是当你试图编译一个引用另一个F程序集(例如,
FSharp.Core
)的F项目时,
FSharp.Core.sigdata
会将这些资源转储到外部文件中(
FSharp.Core
)F#编译器需要这些信息——如果它没有作为托管资源嵌入到引用的程序集中,它会查找外部文件。如果找不到外部文件,编译将失败并出错。