我主要在Linux上玩F#,并希望默认引用所有必需的GUI库(Gtk,Gdk,Atk,Glib,Pango,Cairo),以便我可以简单地使用:
open Gtk;;
没有任何其他输入。
我最好的猜测是修改fsi启动脚本,目前看起来像这样:
#!/bin/sh
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe $@
更新:脚本的工作版本,如Stephen的建议:
#!/bin/sh
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe -r "/usr/lib/cli/atk-sharp-2.0/atk-sharp.dll" -r "/usr/lib/cli/glib-sharp-2.0/glib-sharp.dll" -r "/usr/lib/cli/gdk-sharp-2.0/gdk-sharp.dll" -r "/usr/lib/cli/gtk-sharp-2.0/gtk-sharp.dll" -r "/usr/lib/cli/pango-sharp-2.0/pango-sharp.dll" -r "/usr/lib/mono/2.0/Mono.Cairo.dll" $@
答案 0 :(得分:8)
我写了一个小脚本,允许你使用F#Interactive的Gtk#(见下文)。它引用了必要的Gtk#程序集(您可能需要修改路径),它还配置F#Interactive事件循环,以便您可以交互式地创建和显示窗口小部件(例如Window
)。
如果您想自动获得支持,则需要使用参数运行fsi.exe
以在开始mono /.../fsi.exe --load:load-gtk.fsx
上加载脚本(假设您将脚本保存为load-gtk.fsx
)
[<AutoOpen>]
module GtkSharp
// Load some common Gtk# assemblies (from /usr/lib/mono/2.0/../gtk-sharp-2.0)
#r "../gtk-sharp-2.0/gtk-sharp.dll"
#r "../gtk-sharp-2.0/gdk-sharp.dll"
#r "../gtk-sharp-2.0/glib-sharp.dll"
#r "../gtk-sharp-2.0/atk-sharp.dll"
open Gtk
Application.Init()
fsi.EventLoop <-
{ new Microsoft.FSharp.Compiler.Interactive.IEventLoop with
member x.Run() = Application.Run() |> ignore; false
member x.Invoke f =
let res = ref None
let evt = new System.Threading.AutoResetEvent(false)
Application.Invoke(new System.EventHandler(fun _ _ ->
res := Some(f())
evt.Set() |> ignore ))
evt.WaitOne() |> ignore
res.Value.Value
member x.ScheduleRestart() = () }
答案 1 :(得分:3)
在Linux中可能略有不同,但在Windows中,您可以使用-r
在fsi启动时引用程序集。 e.g。
#!/bin/sh
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe -r /usr/somedll.dll $@
答案 2 :(得分:2)
我猜是添加
-r:/path/to/gtk
或
--load:someStartupScript.fs
可能包含一些#r
或其他内容。 fsi /?
你会明白的。