我想从已编译的 F# dll 访问 F# 签名数据。
我知道我可以使用 FSharp.Compiler.Service 从源文件中获取签名数据图书馆。我无法找到一种方法来使用该库从没有源的 dll 中生成签名信息。
我看到两个选项,但我认为可能有一个更简单的解决方案。我知道的两个选项是:
将 F# 源代码嵌入到 dll 中,并使用 FSharp.Compiler.Service 从嵌入资源中提取信息。然后,我可以根据名称对应关系与反射元数据建立任何关联。除非我做错了什么,否则 FSharp.Compiler.Service 无法解释 .fsi 签名文件,因此似乎需要嵌入整个源代码才能正常工作。
从反射元数据重建 F# 签名。这种方法似乎必然不够,因为某些数据无法通过反射恢复(例如类型别名)。
我的问题是:
是否有比我建议的更好的方法来访问 F# 签名数据并将其与反射元数据关联?
看待这个问题的另一种可能使它更具体的方法是,“给定一个已编译的 F# 程序集,我如何确定可用于引用项目的所有类型别名(及其引用对象)?”
最佳答案
这本质上就是Library documentation part of F# Formatting做。它从已编译的 DLL 生成文档(以及 XML 注释),但关键部分是它从已编译的 DLL 加载有关 F# 代码的元数据。
它的工作方式是使用 F# 编译器服务来构建项目
它使用 F# 编译器服务加载已编译的 F# DLL(就好像您在编译某些代码时引用它一样)。然后,F# 编译器服务会查看有关 DLL 的所有信息,包括别名之类的信息(这就是当您引用 DLL 时 F# 编译器本身看到的信息!)
它的源代码位于 GitHub 上 - 一个好的起点是调用 FSharpAssembly.LoadFiles
here ,它读取稍后处理的元数据。
关于.net - 如何从 F# dll 重建 F# 程序集签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35308249/