Есть ли способ принудительно загрузить модуль, когда он открывается через FSI? - PullRequest
3 голосов
/ 06 мая 2011

Если я скомпилирую следующий модуль в dll

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

затем ссылка на dll в FSI и выполнение команды open MyNs.SomeModule "загрузка модуля" не печатается сразу. Он печатается только когда я получаю доступ к x, что приводит к выполнению всех привязок верхнего уровня let и do (нормальное поведение, которое я знаю в мире .NET) Есть ли способ, возможно, через атрибут на модуле, я могу указать, что модуль должен загружаться сразу после открытия в FSI?

Ответы [ 3 ]

2 голосов
/ 07 июня 2011

Открытие модуля никогда ничего не делает во время выполнения.Он просто помещает все символы в открытое пространство имен в область видимости для неквалифицированного доступа ниже оператора open.

Раздел 12.5 спецификации языка - это то, что вы хотите прочитать - это подробности, когда статическийбудет запущена инициализация модуля.

Учитывая, что единственный раз, когда эта инициализация запускается автоматически, насколько я знаю, это последний модуль в exe.

Т.е. я не думаю, что есть прямой способ выполнить то, что вы хотите.

Если у вас есть рефлексивный доступ к модулю:

ModuleType.TypeInitializer.Invoke(null, null)

вызоветстатическая инициализация.

0 голосов
/ 08 марта 2013

Не уверен, что вы нашли решение вашей проблемы, но в моем случае я хотел запустить агента, когда мой веб-сайт запускался, и он действительно запускался дважды, как вы упомянули.

То, что я сделал, было установленоmethod let start() = внутри модуля и вызовите метод, используя static do xxx.start() из моего основного типа Site.

Обнаружено, что при чтении языковой спецификации Курт связал.

0 голосов
/ 07 мая 2011

Вы можете добавить атрибут AutoOpen в модуль

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

Однако это будет печатать сообщение о загрузке модуля только при ссылке на x.

...