我试图在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
。我环顾四周,看起来like it's possible to use libraries interactively with Visual Studio。有没有办法让它在OS X上运行?
答案 0 :(得分:4)
构建代码时,有关引用的DLL的信息不包含在代码本身中,而是包含在其他地方(项目文件)中。 但是当你在FSI中执行代码时,所有FSI看到的都是代码。它没有可以从中获取引用的项目文件。
但是由于FSI仍然需要偶尔加载引用的DLL(否则,它不会非常有用),它提供了一种在代码中对它们进行编码的方法。这种方式描述为in the page you linked - 特别是#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与代码文件位于同一目录中。而且它没有扩展。