这个问题的动机是我使用JetBrains dotPeek来反编译用F#编写的.exe,但是输出项目目录生成了C#代码。为什么要反编译F#程序集会生成C#代码? >
我知道这两种语言都已从MSIL编译为本地语言的JIT,这可能使得很难确切地说出原始语言是什么。通过静态分析区分C#二进制文件和F#二进制文件?动态分析?

#1 楼


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


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


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


有一些提示可以指导您。检查参考。如果引用FSharp.Core,则可能是用F#编写的。另一方面,如果不是这样的话,则:)

F#的dll通常具有很多属性,这些属性放在诸如[FSharpInterfaceDataVersion][CompilationMappingAttribute]之类的类上。检查一下。

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