2013-06-04 36 views
1

當在SomeLib.fs單獨Fsharp項目文件中的以下代碼編譯:能在Fsharp腳本文件沒有打開命名空間

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

,並要引用,並像一個腳本文件中使用此類型:

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

這是不可能的,雖然dll的路徑是正確的,我檢查了一切。另外,當SomeLib.fs文件位於同一個項目中並且被#load引用時,您仍然無法打開命名空間。

我知道你可以把這個類型放在一個模塊中,但是我不能這樣做,因爲這個類型已經被用作一個Wcf服務類型。

回答

3

經過大量的實驗工作和令人驚訝的一點信息在互聯網上或在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。

+0

請注意:當您使用依賴#I導入的#r引用時,智能感知通常不適用於引用中的類型。但是,當您使用「獨立」#r參考(完整路徑,不帶#I)時,智能感知可以正常工作。這就是爲什麼我幾乎從不使用#I,但它會是非常實用的,否則... –

+0

「我無法添加對外部F#庫DLL的引用」:添加對外部F#庫DLL的引用是絕對有可能的。有時你必須小心引用的順序。如果F#dll依賴於C#dll,則必須先引用c#dll,然後再引用F#dll ... –

+0

@MarcSigrist我試過上面的代碼,它絕對沒有引用F#dll,我可以向你保證。唯一的可能性仍然是我在上面的代碼中做了一些愚蠢的事情。我也在這裏發佈了一個更詳細的答案和解決方案:http://stackoverflow.com/questions/16937387/f-and-c-sharp-web-service-cannot-open-namespace – halcwb

0

如果在Windows上,導入指令中的斜槓應該用反斜槓代替。

+0

謝謝,但實際上並不重要。你甚至可以混合前進和反斜槓(儘管它是醜陋的)。 – halcwb

+0

驚喜!我不知道,謝謝你的提示! –