2010-11-13 34 views
5

Tôi chủ yếu chơi với F # trên Linux và muốn nhận tất cả các thư viện GUI cần thiết (Gtk, Gdk, Atk, Glib, Pango, Cairo) để tham chiếu theo mặc định để tôi có thể sử dụng đơn giản: open Gtk;; đánh máy. đoán tốt nhất của tôi sẽ thay đổi kịch bản FSI ra mắt, mà lúc này trông như thế:Làm cách nào để buộc F # tương tác tham chiếu Gtk # theo mặc định?


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

Cập nhật: phiên bản của kịch bản làm việc như trong gợi ý 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" [email protected] 

Trả lời

8

Tôi đã viết một tập lệnh nhỏ cho phép bạn sử dụng Gtk # từ F # Interactive (xem bên dưới). Nó tham chiếu đến các hội đồng Gtk # cần thiết (bạn có thể cần sửa đổi đường dẫn) và nó cũng cấu hình vòng lặp sự kiện F # Interactive, để bạn có thể tạo và hiển thị các widget (chẳng hạn như Window) một cách tương tác.

Nếu bạn muốn nhận được sự hỗ trợ tự động, bạn sẽ cần phải chạy fsi.exe với một tham số để tải các tập lệnh khi khởi mono /.../fsi.exe --load:load-gtk.fsx (giả định rằng bạn lưu các kịch bản như 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

Như tôi đã nói trong câu hỏi sửa đổi kịch bản là "phỏng đoán tốt nhất của tôi". Câu trả lời này trình bày một cách tiếp cận tốt hơn nhiều. Cảm ơn Tomas –

3

Nó có thể là một chút khác biệt trong Linux, nhưng trong Windows, bạn có thể tham khảo các hội đồng về khởi động fsi bằng cách sử dụng -r. ví dụ.

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

Bạn nên sử dụng ' "$ @" 'để giữ lại bất kỳ trích dẫn nào được thực hiện trên đối số tập lệnh này. –

2

Tôi đoán thêm

-r:/path/to/gtk 

hoặc

--load:someStartupScript.fs 

mà có thể bao gồm một số #r s hoặc có điều gì. fsi /? và bạn sẽ tìm ra.

Các vấn đề liên quan