如何判断特定的 .NET 程序集是用 C# 还是 F# 编写的?

逆向工程 反编译 。网 C#
2021-06-18 09:51:19

这个问题的动机是我使用JetBrains dotPeek反编译了一个用F#编写的.exe,但是输出项目目录产生了C#代码。

为什么反编译 F# 程序集会生成 C# 代码?

我知道这两种语言都是从 MSIL 到本地代码的 JIT 编译,这可能很难明确说明原始语言是什么。

尽管如此,是否有可靠的方法通过静态分析区分 C# 二进制文件和 F# 二进制文件?动态分析?

1个回答

为什么反编译 F# 程序集会生成 C# 代码?

它没有。它生成 IL 代码,然后可以将其解释为 C#、F# 或 VB.NET。dotPeek 不允许您使用任何其他语言进行预览,但例如dnSpyILSpy允许您选择自己喜欢的语言。只是想知道是否有任何工具允许 F#。不确定/没见过。

尽管如此,是否有可靠的方法通过静态分析区分 C# 二进制文件和 F# 二进制文件?动态分析?

有一些提示可以指导您。检查参考资料。如果某些内容正在引用,FSharp.Core则可能是用 F# 编写的。另一方面,如果不是,那可能不是:)

F# 的 dll 通常有很多属性放在像[FSharpInterfaceDataVersion][CompilationMappingAttribute]正在使用的类上检查它们。

还有一件事。F# 编译器能够通过生成调用操作码来使用尾递归而 C# 并非如此(至少目前如此)。这可能是一个指标。但它也可以在完全用 C# 编写后手动制作以使用它。