Bash 默认情况下,如何强制F#interactive引用Gtk?

Bash 默认情况下,如何强制F#interactive引用Gtk?,bash,f#,mono,gtk#,f#-interactive,Bash,F#,Mono,Gtk#,F# Interactive,我主要是在Linux上玩F#,希望在默认情况下引用所有必要的GUI库(Gtk、Gdk、Atk、Glib、Pango、Cairo),这样我就可以简单地使用: 开放Gtk;; 无需任何额外键入。 我的最佳猜测是修改fsi启动脚本,目前看起来是这样的: #!/bin/sh exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe $@ 更新:斯蒂芬建议中的脚本工作版本: #!/bin/sh exec /usr/

我主要是在Linux上玩F#,希望在默认情况下引用所有必要的GUI库(Gtk、Gdk、Atk、Glib、Pango、Cairo),这样我就可以简单地使用:

开放Gtk;;
无需任何额外键入。 我的最佳猜测是修改fsi启动脚本,目前看起来是这样的:


    #!/bin/sh  
    exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe $@
更新:斯蒂芬建议中的脚本工作版本:


    #!/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" $@

在Linux中可能有点不同,但在Windows中,您可以使用
-r
在fsi启动时引用程序集。e、 g

#!/bin/sh
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe -r /usr/somedll.dll $@ 
我猜是的

-r:/path/to/gtk


其中可能包括一些
#r
s或诸如此类的东西
fsi/?
你会明白的。

我写了一个小脚本,允许你从F#Interactive使用Gtk(见下文)。它引用必要的Gtk程序集(您可能需要修改路径),并配置F#Interactive event loop,以便您可以交互地创建和显示小部件(如
窗口

如果希望自动获得支持,则需要在开始时运行带有参数的
fsi.exe
,以加载脚本
mono/../fsi.exe--load:load gtk.fsx
(假设将脚本另存为
load gtk.fsx

[]
模块GtkSharp
//加载一些常见的Gtk组件(来自/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”
开放式Gtk
Application.Init()
fsi.EventLoop忽略;假的
成员x.调用f=
设res=ref无
设evt=new System.Threading.AutoResetEvent(false)
Application.Invoke(新系统.EventHandler(fun)->
res:=Some(f())
evt.Set()|>忽略)
evt.WaitOne()|>忽略
价值
成员x.ScheduleRestart()=()}

正如我在问题中所说,修改脚本是“我的最佳猜测”。这个答案提供了一个更好的方法。感谢您的帮助,您应该使用
“$@”
来保留在此脚本参数上所做的任何引用。
--load:someStartupScript.fs
[<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() = () }