2012-03-03 3 views
3

Salut aimerait savoir comment faire le compilateur f # pour ouvrir automatiquement un espace de noms automatiquement.Auto ouvrir un espace de noms en F #

J'ai

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 = 
    .... 

Merci

+0

Pourquoi avez-vous besoin de faire cela? Le module auto-ouvert n'est-il pas suffisant pour vous? – pad

+0

Non Je veux que dès que j'ai référencé la bibliothèque d'un projet externe le chemin vers XXX.YYY est automatiquement ouvert et je peux accéder à la fonction qui est dans le module XXX.YYY Je sais que ça ressemble à ce que j'ai dans mon code extrait mais je ne me souviens pas exactement – fabco63

Répondre

11

Afin d'ouvrir un espace de noms/module sans ouvrir d'abord son parent, vous devez ajouter l'attribut au niveau de l'assembly. Vous pouvez le faire en ajoutant un fichier AssemblyInfo.fs à votre projet:

Dans le cas du code ci-dessous:

namespace Framework 

module GlobalFunctions = 

    let Test() = 
    10. 

Vous serait, par exemple, ajoutez le code suivant à AssemblyInfo.fs:

namespace Framework 

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

do() 

Et vous pouvez appeler le code à partir d'un fichier script (.fsx) avec:

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

let result = Test() 

Résultats:

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

L'attribut AutoOpen peut être appliqué uniquement à F # module, donc vous ne serez pas en mesure d'ajouter à un namespace entier. Cependant, puisque vous pouvez placer toutes les déclarations F # dans un module, cela peut suffire pour ce dont vous avez besoin. La syntaxe est:

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

Lorsque vous faites référence à l'assemblée, vous devriez voir Foo immédiatement. Si la déclaration est placée dans un autre espace de nom (par exemple, MyLibrary), vous devez ajouter open MyLibrary, mais MyGlobals sera automatiquement accessible.

+0

Salut Tomas, voir mon commentaire précédent à pad. Ce que je veux est légèrement différent de ce que vous suggérez – fabco63