如何从 F# dll 重建 F# 程序集签名

How to reconstruct F# assembly signature from F# dll

我想从已编译的 F# dll 访问 F# 签名数据。

我知道我可以使用 FSharp.Compiler.Service 库从源文件中获取签名数据。我找不到使用该库从没有源代码的 dll 生成签名信息的方法。

我看到了两个选项,但我认为可能有更简单的解决方案。我知道的两个选项是:

  1. 在dll中嵌入F#源代码并使用FSharp.Compiler.Service从嵌入的资源中提取信息。然后我可以根据名称的对应关系与反射元数据建立任何关联。除非我做错了什么,否则 FSharp.Compiler.Service 无法解释 .fsi 签名文件,因此似乎需要嵌入整个源代码才能正常工作。

  2. 从反射元数据重建 F# 签名。这种方法似乎必然不够,因为某些数据无法通过反射恢复(例如类型别名)。

我的问题是:

是否有比我建议的更好的方法来访问 F# 签名数据并将其与反射元数据相关联?

另一种看待这个问题的方法可能会使它更具体一点,"Given a compiled F# assembly, how can I determine all the type aliases (and referents thereof) that would be available to referencing projects?"

这基本上就是 Library documentation part of F# Formatting 所做的。它从编译的 DLL 生成文档(连同 XML 注释),但关键部分是它从编译的 DLL 加载有关 F# 代码的元数据。

它的工作方式是使用F#编译器服务来构建一个项目

它使用 F# 编译器服务加载已编译的 F# DLL(就像您在编译某些代码时引用它一样)。然后,F# 编译器服务会看到有关 DLL 的所有信息,包括别名之类的信息(当您引用 DLL 时,F# 编译器本身会看到这些信息!)

它的源代码在 GitHub - 好的起点是调用 FSharpAssembly.LoadFiles here,它读取稍后处理的元数据。