【问题标题】:How determine that assembly was compiled from f# project?如何确定该程序集是从 f# 项目编译的?
【发布时间】:2020-09-11 12:46:25
【问题描述】:

c# 和 f# 程序集有什么区别?也许是一些标志?我只想使用反射 API 来确定它

【问题讨论】:

  • 也许Assembly.LoadFile(path).GetReferencedAssemblies().Any(a=>a.Name == "FSharp.Core") 作为 prolly F# 库会有这样的依赖或 assembly.GetTypes().Any(t=>t.FullName.StartsWith("<StartupCode")) 作为 F# 编译器添加这样的命名空间和类...你可以同时检查

标签: c# .net f# .net-assembly


【解决方案1】:

没有一个单一的值可以告诉您您需要什么,但有大量间接证据可供您查看 - 如果您想探索它,IlSpy 是您的朋友。

我建议您检查这两个指标是否存在,其中任何一个都存在意味着您很可能正在查看 F# 程序集,除非有人真的专门为您搞砸了。

  • FSharpInterfaceDataVersionAttribute 在程序集中。这是我最初的建议,但是有一些编译器标志在设置时会阻止此属性被发出:--standalone--nointerfacedata。我非常怀疑它们中的任何一个是否会在该领域中普遍使用,但事实仍然是存在公开可用的方法来选择退出当前发出的属性。

    asm.GetCustomAttribute(typeof(FSharpInterfaceDataVersionAttribute))
    
  • 存在StartupCode 类型。它们是 F# 编译器如何编译某些结构的产物,看起来它们甚至是空的,因此它们应该是高度可靠的。

    asm.GetTypes().Where(fun x -> x.FullName.StartsWith("<StartupCode$"))
    

特别是寻找对FSharp.Core 的引用并不是一个好主意,因为如果您使用混合解决方案,它通常也会从 C# 项目中引用(并且没有什么能阻止任何人从 nuget 中获取它) )。

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多