IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

Fichiers de configuration en C++/CLI


Sujet :

C++/CLI

  1. #1
    Membre averti
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Par d�faut Fichiers de configuration en C++/CLI
    Bonjour,

    Je ne parviens pas � r�cup�rer la section d'un fichier de configuration charg�.
    Je suis parti de ce tutoriel:
    http://nico-pyright.developpez.com/t...rationsection/

    Voici le code que j'utilise:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Ouverture du fichier de configuration
    System::Configuration::ExeConfigurationFileMap^ fileMap = gcnew System::Configuration::ExeConfigurationFileMap();
    fileMap->ExeConfigFilename = sConfig;
    System::Configuration::Configuration^ config =
    	System::Configuration::ConfigurationManager::OpenMappedExeConfiguration(fileMap, System::Configuration::ConfigurationUserLevel::None);
     
    // Récupération de la section
    System::Configuration::ConfigurationSection^ section
    	= config->GetSection("MonGroupe/MaSectionUne");
    System::Collections::Specialized::NameValueCollection^ nsection
    	= dynamic_cast<System::Collections::Specialized::NameValueCollection^>(section);
    L'appel de la fonction GetSection retourne bien une ConfigurationSection valide. Mais le cast en NameValueCollection comme indiqu� sur le tuto ne fonctionne pas (<valeur non d�finie>)

    Je ne trouve pas comment acc�der aux paires [key, value] d'une ConfigurationSection.
    Quelqu'un aurait-il une piste ?

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    3 Pistes:

    - Avant de caster comme un sauvage votre variable "section", v�rifiez avec le d�buggeur de VS le type r�el de cette variable. (Si elle n'est pas nulle )
    - Avec le contenu du fichier de config, on pourrait peut-�tre vous dire ou votre code n'est pas bon, vis-�-vis du fichier.
    - Le fichier n'a pas �t� trouv� car non copi� en post-compilation � l'endroit pr�vu.

  3. #3
    Membre averti
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Par d�faut
    - Quand je r�cup�re la section avec le code suivant la variable section n'est pas nulle. Avec le debugger Visual, la variable membre _rawXml de la section est bien remplie avec le fichier de config.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    // Récupération de la section
    System::Configuration::ConfigurationSection^ section
    	= config->GetSection("MonGroupe/MaSectionUne");
    - Mon fichier est celui du tuto, � savoir

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <configuration>
      <configSections>
        <sectionGroup name="MonGroupe">
          <section name="MaSectionUne" type="System.Configuration.NameValueSectionHandler" />
          <section name="MaSectionDeux" type="System.Configuration.DictionarySectionHandler" />
        </sectionGroup>
      </configSections>
      <MonGroupe>
        <MaSectionUne>
          <add key="cle1" value="valeur1" />
          <add key="cle2" value="valeur2" />
          <add key="cle3" value="valeur3" />
        </MaSectionUne>
        <MaSectionDeux>
          <add key="id1" value="valeur4" />
          <add key="id2" value="valeur5" />
          <add key="id3" value="valeur6" />
        </MaSectionDeux>
      </MonGroupe>
    </configuration>
    - Le fichier est bien copi�, bien charg� car je r�cup�re bien la section

    En r�sum� tout ce passe bien jusqu'au cast...

  4. #4
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    v�rifiez avec le d�buggeur de VS le type r�el de cette variable
    section

  5. #5
    Membre averti
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Par d�faut
    Voici ce que j'ai dans le debugger

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    -		section	0x0012f0e4 { _section=0x01d72c88 }	System::Configuration::ConfigurationSection^
    +		[System::Configuration::DefaultSection^]	0x0012f0e4 { s_properties=0x02cd7cb4 _rawXml="<MaSectionUne>
          <add key="cle1" value="valeur1" />
          <add key="cle2" value="valeur2" />
          <add key="cle3" value="valeur3" />
        </MaSectionUne>" _isModified=false }	System::Configuration::DefaultSection^
    +		System::Configuration::ConfigurationElement^	0x0012f0e4 { LockAttributesKey="lockAttributes" LockAllAttributesExceptKey="lockAllAttributesExcept" LockElementsKey="lockElements" ...}	System::Configuration::ConfigurationElement^
    +		SectionInformation	0x01b317a8 { Flag_Attached=1 Flag_Declared=2 Flag_DeclarationRequired=4 ...}	System::Configuration::SectionInformation^
    +		_section	0x01d72c88 { Flag_Attached=1 Flag_Declared=2 Flag_DeclarationRequired=4 ...}	System::Configuration::SectionInformation^
    Le type r�el de la variable section serait un System::Configuration::ConfigurationElement^ ?

  6. #6
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    Il semble que c'est un probl�me de retro-compatibilit�:
    http://www.eggheadcafe.com/software/...iguration.aspx

    A la place de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    // Récupération de la section
    System::Configuration::ConfigurationSection^ section
    	= config->GetSection("MonGroupe/MaSectionUne");
    utilisez :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    NameValueCollection ^section = (NameValueCollection^)ConfigurationManager::GetSection("MonGroupe/MaSectionUne");
    Remarquez l'utilisation de la m�thode statique de ConfigurationManager et non la m�thode d'instance de ConfigurationSettings.

  7. #7
    Membre averti
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Par d�faut
    La m�thode statique me retourne un pointeur nul.
    Ce qui est normal vu que je charge le fichier de configuration en utilisant un objet.
    A moins qu'il existe �galement une m�thode statique qui permette de charger un fichier de config ??

  8. #8
    Membre averti
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Par d�faut
    En suivant cette piste:
    http://stackoverflow.com/questions/1...194763#2194763

    Je suis arriv� au code suivant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    System::Configuration::ExeConfigurationFileMap^ fileMap = gcnew System::Configuration::ExeConfigurationFileMap();
    fileMap->ExeConfigFilename = sConfig;
    System::Configuration::Configuration^ config =
    	System::Configuration::ConfigurationManager::OpenMappedExeConfiguration(fileMap, System::Configuration::ConfigurationUserLevel::None);
     
    System::Configuration::ConfigurationSection^ section;
    section = config->GetSection("MonGroupe/MaSectionUne");
     
    String^ rawXml = section->SectionInformation->GetRawXml();
    System::Xml::XmlDocument^ doc = gcnew System::Xml::XmlDocument();
    doc->Load(gcnew StringReader(rawXml));
    System::Configuration::SingleTagSectionHandler^ handler = gcnew System::Configuration::SingleTagSectionHandler();
    obj = handler->Create(doc, doc, doc->DocumentElement);
    System::Collections::Hashtable^ result = dynamic_cast<System::Collections::Hashtable^>(obj);
    for each (String^ item in result->Keys)
    {
    	Console::WriteLine("{0}\t=\t{1}", item, result[item]);
    }
    Sauf que la ligne 14 (handler->Create()) me p�te une erreur 'System.InvalidCastException'.

    Je ne sais plus quoi faire...

  9. #9
    Membre averti
    Profil pro
    dev
    Inscrit en
    Avril 2010
    Messages
    53
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : dev

    Informations forums :
    Inscription : Avril 2010
    Messages : 53
    Par d�faut
    J'ai enfin r�solu mon probl�me

    Voici le fichier app.config utilis�.
    Noter l'absence de la balise xml.

    <?xml version="1.0" encoding="utf-8" ?>
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <configuration>
      <configSections>
        <sectionGroup name="MonGroupe">
          <section name="MaSectionUne" type="System.Configuration.NameValueSectionHandler" />
          <section name="MaSectionDeux" type="System.Configuration.DictionarySectionHandler" />
        </sectionGroup>
      </configSections>
      <MonGroupe>
        <MaSectionUne>
          <add key="cle1" value="valeur1" />
          <add key="cle2" value="valeur2" />
          <add key="cle3" value="valeur3" />
        </MaSectionUne>
        <MaSectionDeux>
          <add key="id1" value="valeur4" />
          <add key="id2" value="valeur5" />
          <add key="id3" value="valeur6" />
        </MaSectionDeux>
      </MonGroupe>
    </configuration>
    Pour lire ce fichier, le code est le suivant

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // Configuration File
    ExeConfigurationFileMap^ fileMap = gcnew ExeConfigurationFileMap();
    fileMap->ExeConfigFilename = sConfig;
    System::Configuration::Configuration^ config =
    	System::Configuration::ConfigurationManager::OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel::None);
     
    // Group
    ConfigurationSection^ group = config->GetSection("MonGroupe/MaSectionUne");
     
    // XML
    String^ rawXml = group->SectionInformation->GetRawXml();
    System::Xml::XmlDocument^ doc = gcnew System::Xml::XmlDocument();
    doc->Load(gcnew StringReader(rawXml));
     
    // Section
    NameValueSectionHandler^ handler = gcnew NameValueSectionHandler();
    Object^ obj = handler->Create(nullptr, nullptr, doc->DocumentElement);
    NameValueCollection^ section = dynamic_cast<NameValueCollection^>(obj);
     
    for each(String^ aKey in section)
    {
    	Console::WriteLine("{0} ; {1}", aKey, section[aKey]);
    }
    Noter la correspondance de l'utilisation de la classe NameValueSectionHandler() avec le type de la section type="System.Configuration.NameValueSectionHandler" d�finit dans le fichier app.config.

    D'autre part en C++/CLI, un pointeur nul est d�finit par nullptr (et pas null ou 0)


    Probl�me r�solu

  10. #10
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    Un grand merci pour ce partage de votre solution.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Log4j] fichier de configuration ou XML ?
    Par nabilblk dans le forum Logging
    R�ponses: 2
    Dernier message: 02/09/2005, 16h42
  2. [langage] Lire un fichier de configuration
    Par bobinoo dans le forum Langage
    R�ponses: 3
    Dernier message: 04/08/2004, 15h53
  3. Les fichiers de configuration de comptes avec Samba
    Par tomnie dans le forum R�seau
    R�ponses: 4
    Dernier message: 18/03/2004, 08h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo