3

我正在尝试在 OS X El Capitan 上的 Xamarin Studio 5.9.8 中运行 suave(网络服务器)的演示代码。

module ServerTest =
    open Suave                 // always open suave
    open Suave.Http.Successful // for OK-result
    open Suave.Web             // for config

    startWebServer defaultConfig (OK "Hello World!")

当我实际构建代码时,它按预期工作。但是当我尝试以交互方式运行它时,使用 ctrl + return,我得到了错误The namespace or module 'Suave' is not defined。我环顾四周,看起来可以与 Visual Studio 交互使用库。有没有办法让它在 OS X 上运行?

4

1 回答 1

5

当您构建代码时,有关引用的 DLL 的信息不包含在代码本身中,而是包含在其他地方(项目文件)。但是当您在 FSI 中执行代码时,FSI 看到的只是代码。它没有从中获取参考的项目文件。

但是由于 FSI 仍然需要偶尔加载引用的 DLL(否则它不会很有用),它提供了一种在代码中对它们进行编码的方法。这种方式在您链接的页面中进行了描述- 特别是#r指令。

不幸的是,当您使用编译器构建代码时,这些指令不受支持。编译器在看到它们时会产生错误。

所以看起来你有一个选择:要么用 FSI 执行代码,要么用编译器构建它。不能对两者使用相同的代码。

幸运的是,有一些技巧可以解决这个问题。

首先,您可以利用一个名为的特殊条件编译变量INTERACTIVE并将#r指令放入其中,#if这样只有 FSI 才能看到它,但编译器不会:

#if INTERACTIVE
   #r "./path/to/my.dll"
#endif

其次,您可以创建一个单独的脚本文件来加载引用,然后加载您的实际代码文件:

#r "./path/to/my.dll"
#load "./my_code.fs"

然后用 FSI 执行这个脚本文件。

在这两种情况下,路径都是相对于脚本文件的。
这意味着您遇到的“未找到”错误可能是由于 Suave DLL 的路径不正确。我严重怀疑 DLL 与代码文件位于同一目录中。而且它没有扩展名。

于 2015-11-07T03:15:05.753 回答