2

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

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

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

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

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

我知道您可以将类型放入模块中,但我不能这样做,因为该类型已用作 Wcf 服务类型。

4

2 回答 2

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# 内部结构的有限了解

编辑:正确而完整的答案是,我没有实现默认构造函数。不过,如果您不想这样做,上述方法是一种替代方法。感谢马克西格里特。

于 2013-06-05T11:22:43.793 回答
0

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

于 2013-06-05T11:10:58.157 回答