【问题标题】:how to get f# scripts to call module func?如何让 f# 脚本调用模块 func?
【发布时间】:2026-01-01 01:00:01
【问题描述】:

只是试图构建一个 F# 库。到目前为止,它“看起来”是:

  • 我只能从 .fs 源文件中引用 C# 库,

  • 和 .fs 源文件不可用于 .fsx 脚本文件。

这些陈述是否正确?我读的例子说只使用一个打开,但这只能从 .fs 文件中使用。

有没有版本

#r "System.Drawing.dll"

对于在同一项目中通过 f# interactive (fsi) 使用的脚本文件?

另外,我发现*模块和低级模块之间的语法差异有点奇怪。顶我,顶层没有等号很奇怪。

module Utilities

    module et =

为什么不保持一致并为所有内容都设置“module moduleName =”?

【问题讨论】:

标签: f#


【解决方案1】:

请务必注意,F# 中 Visual Studio 中的“引用”仅适用于当前项目。如果您在脚本文件中工作,它不会看到项目引用的库。

要引用脚本文件中的库(例如Script.fsx),您可以编写(可以使用绝对路径和相对路径):

#r @"C:\<path_to_library>\library.dll"

如果您想从脚本文件加载不是脚本的文件(例如Library.fs),您可以使用:

#load "Library.fs"

fs 文件本身不能包含#r 之类的指令,因此如果该文件正在使用一些需要引用的库,则需要在主脚本文件中有一个#r 指令(以引用该库在加载源文件之前)。

至于模块不一致,主要原因是在顶层使用module Foonamespace Foo时,文件其余部分不需要缩进:

module Foo

let bar = 10
module Sub = 
  let bar = 12

【讨论】:

  • “你需要在主脚本文件中有一个#r 指令(在加载源文件之前引用库)”——这似乎很遗憾。您认为他们的目标是更加协调一致,还是在实践中这不是什么大问题?
  • 我们可以指向 .csproj 或 .fsproj 文件而不是 .dll 吗?指向 proj\bin\debug\proj.dll 并不顺利。不过谢谢。 #load 现在按预期工作。