2010-11-13 30 views
5

我主要在Linux上玩F#,並希望得到所有必要的GUI庫(Gtk,Gdk,Atk,Glib,Pango,Cairo)默認引用,這樣我就可以簡單地使用: open Gtk;; 沒有任何額外的打字。 我最好的猜測將修改FSI啓動腳本,這在目前看起來像這樣:如何強制F#交互默認引用Gtk#?


    #!/bin/sh 
    exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe [email protected] 

更新:工作腳本的版本在斯蒂芬的建議:


    #!/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" [email protected] 

回答

8

我寫了一個小腳本,允許您使用來自F#Interactive的Gtk#(見下文)。它引用必要的Gtk#程序集(可能需要修改路徑),並且它還配置F#交互式事件循環,以便交互式地創建和顯示小部件(如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() =() } 
+0

正如我在修改腳本的問題中所說的那樣,是「我最好的猜測」。這個答案提出了一個更好的方法。感謝Tomas – 2010-11-13 22:03:00

3

可能在Linux中稍有不同,但在Windows中,您可以使用-r在fsi啓動時引用程序集。例如

#!/bin/sh 
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe -r /usr/somedll.dll [email protected] 
+0

你應該使用' 「$ @」'保留在這個腳本參數上完成的任何引用。 – 2010-11-13 23:33:46

2

我猜添加

-r:/path/to/gtk 

--load:someStartupScript.fs 

這可能包括一些#r S或諸如此類的東西。 fsi /?,你會發現它。