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 :

[C# & C++] Lire un ArrayList par C++


Sujet :

C++/CLI

  1. #1
    Membre confirmé Avatar de anas.eh
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Par défaut [C# & C++] Lire un ArrayList par C++
    Salut,

    J'ai sérialisé un ArrayList par C#, et je veux le déserialiser dans un programme C++, est-ce que quelqu'un saura m'aider ? C++ pourra récupérer un ArrayList ?

    Merci

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    la désérialisation en C++/CLI foncitonne de la meme facon qu'en c#, c'est juste une question de syntaxe
    tu peux t'inspirer de la faq c++/cli http://dotnet.developpez.com/faq/cpp...#serialization

  3. #3
    Membre confirmé Avatar de anas.eh
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Par défaut
    Là je veux une sérialisation binaire, parce que je pense qu'il n'y a pas d'objet de type ArrayList dans C++, à noter que mon outil que j'ai réalisé c'était en C#.
    En fait, cet outil renvoie le projet sous format d'un tableau en C# (ArrayList) et les utilisateurs travaillent en C++ danc il veulent récupérer leur travail (càd l'ArrayList). Moi j'ai proposé le format XML pcq ça sera facil de le lire avec C++, mais l'encadrant m'a demandé le format binaire, l'idée que j'ai maintenant c'est de faire une sérialisation binaire manuelle, mais ça demande du travail .

    Qu'est-ce que vous en pensez ?

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    le C++/CLI sait travailler avec les arraylist

    maintenant, si tu veux faire une désérialisation native, il va surement falloir implémenter ton propre traducteur.

  5. #5
    Membre confirmé Avatar de anas.eh
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Par défaut
    le C++/CLI sait travailler avec les arraylist
    => Comment déserialiser un ArrayList de C# avec C++ ?

    maintenant, si tu veux faire une désérialisation native, il va surement falloir implémenter ton propre traducteur.
    C'est-à-dire implémenter mon propre serializer, c'est ça ?

    Désolé mais je comprend pas bien le terme natif .

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    ce qu'on entend par natif, c'est du C++ classique, qui ne sait pas utiliser le framework .net et donc par extension, qui n'a pas accès à la class ArrayList

    le C++/CLI, c'est justement du C++ qui sait acceder au framework.Net. Si c'est de ce c++ dont tu parles, c'est TRES simple. Sinon, c'est plus dur

  7. #7
    Membre confirmé Avatar de anas.eh
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Par défaut
    Donc d'après ce que j'ai compris, puisque le C++ .NET comprendra l'ArrayList(C#) la solution est de créer un programme C++ .NET qui transformera mon ArrayList(C#) en ArrayList(C++ natif), c'est ça ?

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    ce que tu peux faire, c'est un intermédiaire oui.
    Désérialiser ton objet en C++/CLI et construire une autre "liste" avec un des conteneurs de la stl, pour que ce soit utilisable en C++ pur

    un programme exemple
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include "stdafx.h"
    #include <windows.h>
    #include <vcclr.h>
    #include <iostream>
    #include <vector>
     
    using namespace System;
    using namespace System::Collections;
     
    int main(array<System::String ^> ^args)
    {
    	// construction de l'arraylist avec des objets simples de type string
    	ArrayList ^list = gcnew ArrayList();
    	list->Add("truc");
    	list->Add("bidule");
    	list->Add("chouette");
     
    	// sérialisation
    	String ^resultSerialisation;
    	System::Xml::Serialization::XmlSerializer ^ sr = gcnew System::Xml::Serialization::XmlSerializer(ArrayList::typeid);
    	System::IO::TextWriter ^ writer = gcnew System::IO::StringWriter();
    	try
    	{
    		sr->Serialize(writer, list);
    		resultSerialisation = writer->ToString();
    	}
    	catch (Exception ^ e)
    	{
    		Console::WriteLine("Impossible de sérialiser : " + e->Message);
    		return 0;
    	}
    	finally
    	{
    		writer->Close();
    	}
     
    	// désérialisation
     
    	ArrayList ^listClone;
    	System::IO::TextReader ^reader = gcnew System::IO::StringReader(resultSerialisation);
    	try
    	{
    		listClone = (ArrayList^)sr->Deserialize(reader);
    	}
    	catch (Exception ^ e)
    	{
    		Console::WriteLine("Impossible de désérialiser : " + e->Message);
    		return 0;
    	}
    	finally
    	{
    		reader->Close();
    	}
     
    	// parcours de la list pour construire un std::vector de std::string
    	std::vector<std::string> vectorNatif;
    	for each(String ^s in listClone)
    	{
    		// au passage, on transforme (marshalle) la chaine managée en chaine native
    		char * chaineChar;
    		pin_ptr<const wchar_t> wch = PtrToStringChars(s);
    		int taille = (s->Length+1) * 2;
    		chaineChar = new char[taille];
    		int t = WideCharToMultiByte(CP_ACP, 0, wch, taille, NULL, 0, NULL, NULL); 
    		WideCharToMultiByte(CP_ACP, 0, wch, taille, chaineChar, t, NULL, NULL); 
    		std::string chaineSTL = chaineChar;
    		vectorNatif.push_back(chaineSTL);
    		delete chaineChar;
    	}
     
    	// parcours du vector
    	for (unsigned int i = 0 ; i < vectorNatif.size() ; i++)
    		std::cout << vectorNatif[i].c_str() << std::endl;;
     
    	return 0;
    }

  9. #9
    Membre confirmé Avatar de anas.eh
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Par défaut
    J'ai créé un projet C++ .NET accompagnant mon projet C#, j'ai essayer le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <windows.h>
    #include <vcclr.h>
    #include <iostream>
    #include <vector>
    using namespace System;
    using namespace System::Collections;
     
    int main()
    {
     
    return 0;
    }
    Mais quand je veux compiler il me retourne une erreur :

    Error 1 fatal error C1190: managed targeted code requires a '/clr' option c:\program files\microsoft visual studio 8\vc\include\vcclr.h 16
    Je sais pas comment le faire, j'ai une autre question, comment appeler un programme C++ .NET par C#.

    Merci,

  10. #10
    Membre confirmé Avatar de anas.eh
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Par défaut
    Ok c bon, j'ai résolu ce problème, la solution je l'ai trouvée ici :http://dotnet.developpez.com/faq/cpp...onmode#clronly

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ecrire/lire des cookies par sérialisation/concaténation
    Par Jean-Seba dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 30/11/2010, 10h36
  2. Lire un fichier par bloc de n*m bytes
    Par chaka_zulu dans le forum Langage
    Réponses: 1
    Dernier message: 24/05/2007, 07h26
  3. Lire fichier ligne par ligne
    Par Tips dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 05/03/2007, 21h07
  4. Lire un fichier par la fin
    Par romaintaz dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 22/01/2007, 16h40
  5. Réponses: 6
    Dernier message: 16/12/2006, 15h08

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