无法在Fsharp脚本文件中打开命名空间

时间:2013-06-04 21:26:03

标签: f# namespaces f#-3.0

在SomeLib.fs文件中的单独Fsharp项目中,编译以下代码:

namespace SomeNameSpace
type SomeType =
    member this.SomeMember = "Some member"

并且您希望在脚本文件中引用和使用此类型,如:

#I @"c:/pathToDll/"
#r "SomeLib.dll"

这是不可能的,虽然dll的路径是正确的,我检查了一切。此外,当SomeLib.fs文件位于同一项目中并由#load引用时,您仍然无法打开命名空间。

我知道你可以把这个类型放在一个模块中,但我不能这样做,因为该类型已被用作Wcf服务类型。

2 个答案:

答案 0 :(得分:4)

经过大量的实验工作以及互联网或F#书籍中令人惊讶的小信息后,我发现了以下内容:

// Cannot use a relative path
//#I @"bin\Debug"
// Have to use a absolute path
#I @"C:\Development\FSharpNameSpaceTest\SomeCSharpLib\bin\Debug"
// But I can reference a Csharp dll lib
#r "SomeCSharpLib.dll"

// I cannot add a reference to an external F# library dll
// #I @"C:\Development\FSharpNameSpaceTest\NameSpace\bin\Debug"
// #r "NameSpace.dll"

// If I directly load the external fs file, it works"
#load @"C:\Development\FSharpNameSpaceTest\NameSpace\SomeNameSpace.fs"
#load "Library1.fs"

// Namespaces in both the local and the external fs files can only be openend if every single file is loaded instead of referencing the dll.
// Referencing a C# dll is no problem

open FSharpNameSpaceTest
open SomeCSharpLib
open NameSpace

我不知道这是否是最佳方法,但它有效。我将要做的是,我将为每个项目创建一个fsx文件,加载该项目中的各个fs文件,然后我将fsx文件加载到引用该项目的fsx文件中。

我仍然觉得这一切都非常令人困惑和违反直觉。但这可能是我对F#内部工作的有限认识

编辑:正确而完整的答案是,我没有实现默认构造函数。不过,如果你不想这样做,上面的方法是另一种选择。感谢Marc Sigrit。

答案 1 :(得分:0)

如果在Windows上,import指令中的斜杠应替换为反斜杠。