如果我将以下模块编译成dll
namespace MyNs
module SomeModule =
do printfn "module loading"
let x = 23
然后在FSI中引用dll并执行命令open MyNs.SomeModule
“模块加载”不立即打印。它仅在我访问x
时打印,这导致所有顶级let和do绑定执行(我在.NET世界中知道的正常行为)。有没有办法,也许是通过模块上的属性,我可以指出模块应该在FSI打开后立即加载?
答案 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链接的语言规范发现。