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

标签 .net reflection f# signature f#-3.0

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

我知道我可以使用 FSharp.Compiler.Service 从源文件中获取签名数据图书馆。我无法找到一种方法来使用该库从没有源的 dll 中生成签名信息。

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

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

  2. 从反射元数据重建 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/

相关文章:

.net - 找不到资源词典

java - 在java中强制在程序启动时加载类

matlab - 您使用 Matlab/F#/R 进行数据分析和建模算法的经验

f# - 为什么我要返回 Async<unit> 而不是 Async<Result>?

.net - 如何在 TeamCity 的 .NET 项目中包含解决方案目录之外的依赖项

c# - 为查询数据库的方法编写单元测试

c# - .Net 5 - WPF,单元测试问题

c# - 如何自动创建属性?

java - 我可以声明返回 Class 对象的方法,但限制为 Java 中给定类型的子类吗?

F# 可选模式匹配