在SomeLib.fs文件中的单独Fsharp项目中,编译以下代码:
namespace SomeNameSpace
type SomeType =
member this.SomeMember = "Some member"
并且您希望在脚本文件中引用和使用此类型,如:
#I @"c:/pathToDll/"
#r "SomeLib.dll"
这是不可能的,虽然dll的路径是正确的,我检查了一切。此外,当SomeLib.fs文件位于同一项目中并由#load引用时,您仍然无法打开命名空间。
我知道你可以把这个类型放在一个模块中,但我不能这样做,因为该类型已被用作Wcf服务类型。
答案 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指令中的斜杠应替换为反斜杠。