自动将 F# 翻译成 C# 的工具

10
我想知道是否有任何自动将F#代码转换为C#代码的方法在实践中能够很好地工作。原因是我们在F#中有一些逻辑,希望能够与Mono for Android、MonocMac、MonoTouch等平台一起使用,创建每个平台的应用程序。由于这些平台不直接支持F#,所以如果我们可以继续使用F#编写逻辑,并使用C#和这些工具进行GUI设计,那将是很好的。 有人知道类似的方法吗?谢谢。

2
不直接支持F#,但是F#的dll和exe也应该可以在这些平台上使用。你尝试过吗? - Onorio Catenacci
5个回答

7
为什么需要翻译代码?已编译的托管二进制代码应该能够与Mono协作良好。只需将其添加到项目中即可。
您可以使用类似ILSpy的工具将代码反编译为其他语言,但这并没有真正改变什么 - 这就是将不同语言编译为.NET CIL的整个目的。

skolima,你确定可以将二进制文件添加到MonoTouch项目中并且能够正常运行吗?请记住,这些框架具有不同的限制,与mono本身不同。 - Jacobo Polavieja
3
是的,我曾看过演示,其中通过Mono Touch在iPhone上运行了一个F#二进制文件。基本上有一些限制,需要能够静态地解析所有内容,但是无论是使用C#还是F#,都可以遵循这些限制。这些限制已经在此文档中记录:http://docs.xamarin.com/ios/about/limitations - Robert
@Robert,我会尝试寻找那个演示,这很好。关于限制部分,我认为问题在于F#的本质更难以静态解析所有内容。那么我会看一下这些情况。非常感谢,非常有帮助。 - Jacobo Polavieja

5
任何支持F#和C#的.NET反编译器都可以做到这一点。例如:Cecil.DecompilerILSpy。Steve Gilham撰写了一些关于使用Cecil.DecompilerILSpy将F#反编译为C#的好文章,以及有关F#和C#代码互操作性的其他博客文章。这些文章可能对您有所帮助。通常情况下,我只在想知道F#代码下面发生了什么时使用ILSpy,当反编译为C#时更加明确。将F#代码编译成单独的dll并在C#代码中使用它是最好的选择。

实际上有没有问题?F#是一个巨大的时间节省器,如果我们稍后需要调整一些东西,那没关系,只要它们不会成为头疼的问题...谢谢。 - Jacobo Polavieja
4
使用ILSpy生成的C#代码可能不太可能编译,因为在F#中任何对闭包的使用都会生成具有无效C#名称的内部类。 - Robert

4

1
感谢您提供这些帮助和改进答案的信息。此外,Miguel de Icaza已经评论说他们正在努力将F#引入Xamarin(http://news.ycombinator.com/item?id=5251413),这是一个好消息,将使F#达到一个全新的水平。 - Jacobo Polavieja
@JacoboPolavieja 几个月前,添加了一个 F# MonoGame 模板。所以有这个选择。 - Jwosty
3
由于现在Xamarin支持F#,我们可以看到令人兴奋的是,我们可以在各个平台上拥有F#应用程序:所有桌面、Web、iOS、Android……令人难以置信的是,这种语言虽然还没有被广泛使用,但它可以定位到如此多不同的平台。太棒了 :)。 - Jacobo Polavieja
是的,我认为 F# 在这方面会更受关注! - Jwosty

4
理论上说,你应该能在MonoTouch和Mono for Android上运行你的F#代码。但是实际上...事情变得更加复杂了。:-)
MonoTouch和Mono for Android提供了它们自己的基础类库,这些类库与桌面.NET不兼容(它们在很大程度上是Silverlight的超集)。为了使你的F#代码在MonoTouch和Mono for Android下运行,你必须首先编译适当的程序集。
此外,你需要删除所有对FSharp.Core.dll的依赖项(这可能吗?)或移植FSharp.Core.dll,以便它可以针对等效的MonoTouch和Mono for Android程序集执行。我相信这是可能的,但我不知道是否已经完成,以及这有多容易。
一旦你删除或满足了FSharp.Core.dll和相关依赖项,你就可以将所有所需的程序集(你的F#程序集加上依赖项)添加到项目中并运行。

3

只需使用--standalone(属性|生成|其他标志|--standalone)编译您的 F# 库,它将把 FSharp.Core.dll 合并到您的库中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接