有没有办法在通过FSI打开模块时强制加载模块?

时间:2011-05-06 17:47:20

标签: f# f#-interactive

如果我将以下模块编译成dll

namespace MyNs
module SomeModule =
    do printfn "module loading"
    let x = 23

然后在FSI中引用dll并执行命令open MyNs.SomeModule“模块加载”不立即打印。它仅在我访问x时打印,这导致所有顶级let和do绑定执行(我在.NET世界中知道的正常行为)。有没有办法,也许是通过模块上的属性,我可以指出模块应该在FSI打开后立即加载?

3 个答案:

答案 0 :(得分:2)

打开模块在运行时永远不会做任何事情。它只是将打开的命名空间中的所有符号放在范围内,以便在open语句下面进行非限定访问。

language spec的第12.5节是您想要阅读的内容 - 这将在模块的静态初始化运行时详细说明。

鉴于此,据我所知,这个初始化自动运行的唯一时间是exe中的最后一个模块。

即。我认为没有直接的方法来实现你想要的东西。

如果您对该模块具有反思性访问权限:

ModuleType.TypeInitializer.Invoke(null, null)

将调用静态初始化。

答案 1 :(得分:0)

您可以将AutoOpen属性添加到模块

[<AutoOpen>]
module SomeModule =
  do printfn "module loading"
  let x = 23

但是,这只会在您引用x时打印模块加载消息。

答案 2 :(得分:0)

不确定您是否找到了问题的解决方案,但在我的情况下,我希望在我的网站启动时启动代理,并且它确实像您提到的那样开始两次。

我所做的是在模块中设置方法let start() =,并使用我的主static do xxx.start()类型中的Site调用该方法。

通过阅读Kurt链接的语言规范发现。