Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Discussion: App.config et fsi.exe

  1. #1
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro Mickaël
    Développeur .NET
    Inscrit en
    octobre 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Nom : Homme Mickaël
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2008
    Messages : 537
    Points : 1 199
    Points
    1 199

    Par défaut App.config et fsi.exe

    Bonjour,

    Question courte et j'espère simple (pour vous):

    Comment réussir à charger des paramètres contenu dans le fichier App.config en utilisant (de préférence) System.Configuration.ConfigurationManager.AppSettings lors d'une exécution via fsi (l'interpréteur REPL)

    Note: Ça fonctionne parfaitement si je lance l'exécution console (via F5 ou CTRL+F5)

    D'avance merci, cordialement !
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )

    À quelle heure dormez-vous ?

    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  2. #2
    LLB
    LLB est déconnecté
    Membre Expert
    Inscrit en
    mars 2002
    Messages
    962
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 962
    Points : 1 128
    Points
    1 128

    Par défaut

    Bonjour,

    Je n'ai pas l'habitude de AppSettings. Pourrais-tu donner ton code qui ne marche pas dans fsi ? Quel message d'erreur ?

    Peut-être est-ce un problème de répertoire ? Le répertoire courant pour fsi n'est pas forcément le même que lorsque tu exécutes ton code. Essaie ceci :

  3. #3
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro Mickaël
    Développeur .NET
    Inscrit en
    octobre 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Nom : Homme Mickaël
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2008
    Messages : 537
    Points : 1 199
    Points
    1 199

    Par défaut

    En fait je n'ai pas d'erreur, simplement je ne retrouve pas les clef que j'y ai enregistré: j'ai mis deux settings, un id et un password et mon fichier App.config est comme ceci
    Code Xml :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
      </startup>
      <appSettings>
        <add key="id" value="monId"/>
        <add key="password" value="monPass"/>
      </appSettings>
    </configuration>

    De l'autre côté j'ai un module Util contenant le chargement des deux valeurs correspondant à ces clefs (avec un bricolage pour le moment )

    (Note: j'ai aussi un fichier fsx qui est appelée conditionnellement si je passe en interactive pour charger les dll via la commande #r)

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #if INTERACTIVE
    open System.Xml.Linq
    #else
    open System.Configuration
    #endif
    
    #if INTERACTIVE
    let private (!!) : string -> XName = XName.op_Implicit
    #endif
    
    let id, password =
        #if INTERACTIVE
        let root = XDocument.Load(__SOURCE_DIRECTORY__ + @"\config.xml").Root
        root.Element(!!"id").Value, root.Element(!!"password").Value
        #else
        let appSettings = ConfigurationManager.AppSettings
        appSettings.Get("id"), appSettings.Get("password")
        #endif
    Donc actuellement, quand j'envoie le code dans F# Interactive, il utilise un document Xml config.xml (à la structure un peu plus simplifiée) que j'ai écrit et qui se trouve dans le même répertoire que le App.config

    Par contre si j'utilise F5 pour une utilisation console, le code passe dans le #else et me ressort mes infos correctement (le même code en Interactive me sort un tuple (null, null)

    De ce que j'en pense, je me dis que comme le App.config génère un fichier Nomrojet.exe.config avec un contenu identique dans le répertoire de sortie, dans le cas où je passe par l'interactive il recherche donc un fichier fsi.exe.config mais j'ai tenté d'en créer un pour voir et ça ne marche pas, doit y avoir une histoire de chemin relatif par rapport à l'exe peut-être

    Quant à la commande #cd je vois pas trop avec quoi l'appeler en fait vu qu'à aucun moment je n'utilise de chemin (relatif ou absolu) nommément (à part ma bricole qui utilise __SOURCE_DIRECTORY__ mais ça on sait où ça pointe)

    J'espère que ça éclaire un peu le problème (et sa solution)

    Cordialement !

    P.S. pour info je me sers de ce code dans ma poursuite de la découverte de F# et plus précisément dans ma participation à ceci si je peux avoir des retours sur le code (même si j'ai axé mon développement d'une manière très objet ; on se refait pas )
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )

    À quelle heure dormez-vous ?

    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  4. #4
    LLB
    LLB est déconnecté
    Membre Expert
    Inscrit en
    mars 2002
    Messages
    962
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 962
    Points : 1 128
    Points
    1 128

    Par défaut

    Je n'ai toujours pas regardé le problème en détail, mais je viens de tomber par hasard sur cette page : http://stackoverflow.com/questions/6...ve-not-working

    Est-ce que ça t'aide ?

  5. #5
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro Mickaël
    Développeur .NET
    Inscrit en
    octobre 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Nom : Homme Mickaël
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2008
    Messages : 537
    Points : 1 199
    Points
    1 199

    Par défaut

    J'étais aussi tombé dessus, et ça ne m'aide pas vraiment, dans le sens où il est soit suggéré de créer un fichier de configuration pour l'interpréteur (fsi.exe) ce qui ne me plait guère. Je préfèrerais à la rigueur avoir un moyen de dire à fsi.exe de charger ce fichier de configuration (celui généré par l'application qui est normalement de la forme App.exe.config) comme si c'était le sien (enfin dans l'idée).

    La seconde me conviendrait déjà plus (enfin ce que j'en comprends) et c'est d'ailleurs en partie sur ce schéma que repose mon bricolage actuel (sauf que je charge un fichier xml "banal"). J'ai l'impression que son extrait de code n'est pas complet, vu qu'il y a un upcast vers MyConfig (qui doit donc être un type) mais définit nulle part.

    J'avoue que j'ai un peu lâché l'affaire aussi, parce que ce n'était pas primordial, et que outre le souci concret présentement, c'est sans doute un souci plus général dans le sens où je ne sais pas trop quand utiliser un fichier fsx ou un fichier fs (et je ne parle pas des fichiers de signature )

    J'ai un autre projet où je m'exerce au langage où j'ai adopté une approche qui me fait penser aux include en C ou C++, c'est à dire le code dans des .fs avec juste en début un #load sur un script (dans un #if INTERACTIVE) qui s'occupe de charger les dépendances dont j'aurais besoin.

    Bref tout ça pour dire que c'est quand même bien flou encore pour moi mais je ne désespère pas le langage me plait trop!
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )

    À quelle heure dormez-vous ?

    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  6. #6
    LLB
    LLB est déconnecté
    Membre Expert
    Inscrit en
    mars 2002
    Messages
    962
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 962
    Points : 1 128
    Points
    1 128

    Par défaut

    Comme tu charges le fichier comme un simple fichier XML, voici une solution toute simple :
    Code :
    1
    2
    3
    4
    let findSetting (root: XElement) name =
        let element = root.Element(!!"appSettings").Elements(!!"add")
                   |> Seq.find (fun x -> x.Attribute(!!"key").Value = name)
        element.Attribute(!!"value").Value
    Il y a peut-être une solution plus intelligente, mais je ne connais pas bien les fonctions du ConfigurationManager.

  7. #7
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro Mickaël
    Développeur .NET
    Inscrit en
    octobre 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Nom : Homme Mickaël
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2008
    Messages : 537
    Points : 1 199
    Points
    1 199

    Par défaut

    Oui, j'avais pas vraiment songé à utiliser directement le fichier de config comme ce qu'il est, à savoir un fichier xml (c'est pour ça que je m'en avais fait un personnalisé à côté )

    J'avoue que le ConfigurationManager en lui même je connais peu aussi, mais je vais me faire des tests sur projet vierge voir si je peux en tirer quelque chose sinon je me contenterais de cela à défaut de mieux.

    Juste une question par rapport à ton code, il ne serait pas plus prudent d'utiliser un try...with (qui renverrait null) ou d'utiliser un MaybeBuilder (enfin de ce que j'ai compris des monades ça pourrait convenir) parce que rien ne dit, dans l'absolu, qu'un fichier de config possède une section appSettings
    (Bon je vois peut-être trop loin en pensant réutilisabilité de la fonction aussi )
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )

    À quelle heure dormez-vous ?

    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  8. #8
    LLB
    LLB est déconnecté
    Membre Expert
    Inscrit en
    mars 2002
    Messages
    962
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 962
    Points : 1 128
    Points
    1 128

    Par défaut

    Oui, bien sûr. À toi de voir si c'est utile de faire une gestion d'erreur. Un simple try with suffira généralement (ne t'embête pas avec les monades ici).

    Au fait,
    P.S. pour info je me sers de ce code dans ma poursuite de la découverte de F# et plus précisément dans ma participation à ceci si je peux avoir des retours sur le code
    Je n'avais pas répondu à ça, parce que rien ne m'a choqué dans ton code. Il n'y a aucun problème à utiliser l'objet.

  9. #9
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro Mickaël
    Développeur .NET
    Inscrit en
    octobre 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Nom : Homme Mickaël
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : octobre 2008
    Messages : 537
    Points : 1 199
    Points
    1 199

    Par défaut

    Citation Envoyé par LLB Voir le message
    (ne t'embête pas avec les monades ici).
    J'ai envie de dire ouf , parce que c'est un concept qui a l'air très utile, mais pas forcément simple à comprendre de prime abord.

    Citation Envoyé par LLB Voir le message
    Je n'avais pas répondu à ça, parce que rien ne m'a choqué dans ton code. Il n'y a aucun problème à utiliser l'objet.
    Bon ben surtout que c'est pour moi une des forces du langage d'arriver à pouvoir mêler aussi bien objet que fonctionnel, déjà que j'avais tendance à utiliser des choses su style Func<T, Func<T, R>, R> en C# ou VB.Net

    Concernant le problème je le laisse de côté temporairement, je préfère me consacrer à la poursuite de l'apprentissage mais je laisse le sujet ouvert au cas où.

    Et puis j'ai déjà fort à faire, en ce moment je bataille sur un autre site pour essayer de faire marcher mes codes (il semble qu'ils utilisent une vieille version de mono et le compilateur ne trouve pas des méthodes du style Seq.maxBy) et quand bien même ça marcherait, j'ai déjà du mal à passer sous les seuils de durée en C++
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )

    À quelle heure dormez-vous ?

    Censément, quelqu'un de sensé est censé s'exprimer sensément.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •