【问题标题】:Cannot open namespace in Fsharp script file无法在 Fsharp 脚本文件中打开命名空间
【发布时间】:2013-06-04 21:26:03
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: f# namespaces f#-3.0


    【解决方案1】:

    经过大量的实验工作以及互联网或 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。

    【讨论】:

    • 附带说明:当您使用依赖于 #I 导入的 #r 引用时,智能感知通常不适用于引用中的类型。但是,当您使用“独立”#r 引用(完整路径,没有#I)时,智能感知工作正常。这就是为什么我几乎从不使用#I,尽管否则它会非常实用......
    • “我无法添加对外部 F# 库 dll 的引用”:添加对外部 F# 库 dll 的引用绝对是可能的。有时您必须注意引用的顺序。如果 F# dll 依赖于 C# dll,则必须先引用 c# dll,然后再引用 F# dll...
    • @MarcSigrist 我尝试了上面的代码,但它绝对不能引用 F# dll,我可以向你保证。唯一的可能是我在上面的代码中做了一些愚蠢的事情。我还在这里发布了更详细的答案和解决方案:stackoverflow.com/questions/16937387/…
    • 你的类型不能被实例化,因为它没有构造函数。这与编译器插入默认构造函数的 C# 不同。要添加 ctor,请编写 'type SomeType() = ...'(带大括号)。
    • @MarcSigrist 毕竟我做了一些愚蠢的事情! ;-)。你说的太对了,谢谢!我只是没看到。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,但这实际上并不重要。你甚至可以混合使用正斜杠和反斜杠(虽然很丑)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 2020-10-02
    • 2013-06-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多