2012-03-03 39 views
3

您好想知道如何讓f#編譯器自動自動打開命名空間。自動在F#中打開命名空間

namespace XXX 

I have to add something here do(AutoOpen("XXX.YYY")) or something like that to make the XXX.YYY module to be opened when referencing the library from external projects. 

[<AutoOpen>] 
module YYY = 
    .... 

感謝

+0

爲什麼你需要這樣做?自動打開的模塊不適合你嗎? – pad 2012-03-03 14:50:39

+0

不,我希望儘快從外部項目引用庫到XXX.YYY的路徑會自動打開,我可以訪問模塊XXX.YYY中的函數我知道它看起來像我的代碼snippet但我不記得確切 – fabco63 2012-03-03 16:59:04

回答

11

爲了打開命名空間/模塊而不首先打開它的父項,必須在程序集級別添加該屬性。

在下面的代碼的情況下:

namespace Framework 

module GlobalFunctions = 

    let Test() = 
    10. 

你會例如下面的代碼添加到AssemblyInfo.fs: 您可以通過添加AssemblyInfo.fs文件到您的項目做到這一點

#r @"C:\PathToAssembly\Assembly.dll" 

let result = Test() 
namespace Framework 

[<assembly:AutoOpen("Framework.GlobalFunctions")>] 

do() 

然後你就可以調用從腳本代碼(.fsx)與文件210

造成:

--> Referenced 'C:\PathToAssembly\Assembly.dll' 
val result : float = 10.0 
2

AutoOpen屬性可以只適用於F#module,所以你將無法將其添加到整個namespace。但是,由於您可以將所有F#聲明放在模塊中,所以您可能已足夠滿足您的需求。語法是:

[<AutoOpen>] 
module MyGlobals = 
    // Declarations in the module 
    type Foo() = 
    member x.Bar = 10 

當你引用的程序集,你應該立即看到Foo。如果聲明位於另一個名稱空間(即MyLibrary)內,則需要添加open MyLibrary,但MyGlobals將被自動訪問。

+0

嗨Tomas,看到我以前的評論墊。我想要的與你的建議略有不同 – fabco63 2012-03-03 17:01:00