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

これが最適なアプローチかどうかはわかりませんが、うまくいきます。私がすることは、そのプロジェクトの個々の fs ファイルをロードするすべてのプロジェクトに対して fsx ファイルを作成し、そのプロジェクトを参照する fsx ファイルにその fsx ファイルをロードすることです。

私は今でも、これはすべて非常に紛らわしく、直感に反していると思います。しかし、それはF#の内部構造に関する私の限られた知識かもしれません

編集:正しい完全な答えは、デフォルトのコンストラクターを実装していないことです。それでも、これをしたくない場合は、上記のアプローチが代替手段です。マーク・シグリットに感謝します。

于 2013-06-05T11:22:43.793 に答える
0

Windows の場合、インポート ディレクティブのスラッシュをバックスラッシュに置き換える必要があります。

于 2013-06-05T11:10:58.157 に答える