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# Discussion :

[.NET 2.0] Reflexion en C#


Sujet :

C#

  1. #1
    Nouveau membre du Club Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Points : 32
    Points
    32
    Par défaut [.NET 2.0] Reflexion en C#
    Bonjour à tous!

    Je cherche à implémenter un algo utilisant la réflexion. Mon but est de "remplir" des objets à partir d'un tableau de bytes.
    Ex: j'ai une classe du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class Toto{
      int champ1
      char champ2;
     
      void Toto() {}
    }
    Et un tableau de bytes représentant en mémoire la valeur d'un int et d'un char donc.

    J'aimerais, dynamiquement et en utilisant la réflexion, connaitre le type des champs de mon objet (ca j'y arrive), puis affecter un certain nombre de bytes issus du tableau aux champs (ca, je n'y arrive pas).

    Je pensais, en connaissant mon type, pouvoir en déduire le nombre de bytes à lire (style un int = 4 bytes).

    Je ne sais pas si je suis très compréhensible... si quelqu'un a compris ou veut plus d'explication, je reste dispo.

    Merci
    --
    Carpe Diem

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Je ne suis pas sur d'avoir tout compris, mais peut être que cela peut t'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int t = 0;
    Console.Writeline(t.GetTypeCode());
    Cela t'affiche Int32 et avec cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Int16 t = 0;
    Console.Writeline(t.GetTypeCode());
    Tu as Int16 d'affiché.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  3. #3
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    Si tu connais le type et le nombre de bytes équivalent, il te suffit de faire un ReadBytes de la longueur voulue, puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string s = new string(resultatDuReadBytes);
    int i = Int32.Parse(s);
     
    typeof(Toto).GetProperty("propName").SetProperty(instanceDeToto, i);
    Hervé Delannoy, Ingénieur études&développement.

    Je n'accepte pas les demandes de mise en relation MSN/yahoo sans motif.
    ------------------------------------------------------------------------
    Si , ni , ne peuvent vous aider, mais nous oui, pensez à un pti et au !
    Merci de vous relire
    ____________________________________________________________________________________
    Recherche joueurs de "Magic" sur Lille et environs.
    Donner plutôt que jeter.

  4. #4
    Membre habitué Avatar de jerome.fortias
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 164
    Points : 133
    Points
    133
    Par défaut
    Pour ceux qui ne connaissent pas le concept de réflexion : http://fr.wikipedia.org/wiki/R%C3%A9..._(informatique)

    Dans notre cas il cherche à faire de l'introspection..

    Pourquoi ne pas utiliser les outils de sérialisation XML vers OBJ. En prérequis tu te fais un bout de code qui convertit ton tableau de byte en un XML local et hop tu utilises de standard .net de sérialisation....Cela constituerait une bonne base de départ. Aprés tu peux aller jouer du côté des interfaces et des classes virtuelles...
    Jerome Fortias
    Head of the Business Lab Sopra Steria Brussels

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par jerome.fortias Voir le message
    Pourquoi ne pas utiliser les outils de sérialisation XML vers OBJ.
    Pourquoi ? Ben euh parce que c'est sale !
    Tu veux convertir du binaire en XML pour le retransformer en objet, il n'y a rien qui te choque la dedans ?!
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  6. #6
    Membre habitué Avatar de jerome.fortias
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 164
    Points : 133
    Points
    133
    Par défaut
    Franchement non. Si une transformation de bytes en XML permet d'utiliser un outil générique de .net qui en plus fonctionne bien... Perso je trouve cela efficace. Perso côté saleté y'a largement pire...

    Au passage je suis cette discussion car elle peut intéresser un des gars de mon équipe qui travaille pour l'instant avec des classes virtuelles et des activators. Une approche basé sur la réflexion me parait pas mal du tout et pourrait être une alternative "amusante".

    mais revenons au probleme initial :
    "J'aimerais, dynamiquement et en utilisant la réflexion, connaitre le type des champs de mon objet (ca j'y arrive), puis affecter un certain nombre de bytes issus du tableau aux champs (ca, je n'y arrive pas)."
    ... J'aimerais que le demandeur soit plus clair dans ce qu'il n'arrive pas à faire....exactement (morceaux de code par exemple)
    Jerome Fortias
    Head of the Business Lab Sopra Steria Brussels

  7. #7
    Nouveau membre du Club Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Points : 32
    Points
    32
    Par défaut
    Merci pour vos réponses.

    Le XML, il faut oublier dessuite, car j'utilise un mécanisme .NET Remoting et je ne pourrais pas passer de fichiers d'une machine à une autre.

    Mon problème, de manière plus globale, est le suivant. Je cherche un moyen pour faire cette chaine d'opérations:

    Code C++--> écrit des structures en mémoire dans un MMF
    Code C#--> vient lire mon MMF et extrait un tableau de bytes

    J'aimerais pouvoir retrouver mes structures (sous forme de classe par ex.) au sein de mon programme C#.

    C'est pourquoi je me suis penché sur l'introspection (d'ailleurs, je pensais que introspection == reflexion en C#??) mais sans succès. Je n'arrive pas à réorganiser mon byte[] dans différentes classes.

    PS: pour corser le tout, le code C++ écrit des structures "imbriquées" en mémoire, il serait donc fort génial de disposer d'un code récursif...

    Si quelqu'un a une idée de génie.. sinon je serais obligé de changer mon code C# en du code C++.

    Merci
    --
    Carpe Diem

  8. #8
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Tu peux essayer en utilisant la désérialisation binaire. Tu as déjà jeté un oeil à ce concept ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  9. #9
    Nouveau membre du Club Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Points : 32
    Points
    32
    Par défaut
    en gros voila ce que j'ai codé à l'heure actuelle

    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
     
    List<object> listOfObjectToAssign = new List<object>();
                    List<string> listOfTypesInMemory = new List<string>();
     
                    TDefines.cs_mktFile_pub.Data_Basket mydataBasket = new cs_mktFile_pub.Data_Basket();
                    listOfObjectToAssign.Add(mydataBasket);
     
                    Type myType;
                    MemberInfo[] myMemberInfo;
                    foreach (object obj in listOfObjectToAssign)
                    {
                        myType = obj.GetType();
                        myMemberInfo = myType.GetMembers();
                        for (int i = 0; i < myMemberInfo.Length; i++)
                        {
                            RecursiveGetTypes(myMemberInfo[i], ref listOfTypesInMemory);
                        }
                        for (int i = 0; i < myMemberInfo.Length; i++)
                        {
                            RecursiveSetValues(myMemberInfo[i], ref obj, ref listOfTypesInMemory, ref Footer, ref iPos);
                        }
                    }
    Je cherche à obtenir l'enchainement des types en mémoire pour pouvoir parser le tableau de byte et insérer les valeurs lues dans mes objets.

    Mais je n'y arrive pas.

    Ps: Je n'ai pas mis le code des fonction RecursiveGetTypes, qui remplit une liste des types dans l'ordre où il sont présents en mémoire, et RecursiveSetValues, qui me servirai à insérer des valeurs dans mes différents objets, par souci de lisibilité.
    --
    Carpe Diem

  10. #10
    Nouveau membre du Club Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Tu peux essayer en utilisant la désérialisation binaire. Tu as déjà jeté un oeil à ce concept ?
    Oui, déja essayé, ca me lève l'exception "invalid input stream format". Etant donné que mon tableau de byte n'est pas issu d'une sérialisation, je suppose qu'il doit manquer des tags de sérialisation, non ?
    --
    Carpe Diem

  11. #11
    Nouveau membre du Club Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Points : 32
    Points
    32
    Par défaut
    Personne n'a plus d'idées pour ce problème ?

    Je suis vraiment au point mort là, la seule solution viable à l'heure actuelle serait de recoder mon prog entier en C++, et j'ai vraiment pas envie...

    Je récapitule le problème:

    données en entrée --> lues & traitées par une appli C++-->écriture en mémoire de structures (MMF)-->lecture de la MMF par un client .NET remoting écrit en C# (incapacité de récupérer mes données, j'ai bien un tableau de bytes, mais je n'arrive pas à le parser pour remplir des objets)--> transfert via .NET remoting à un serveur Remoting-->ecriture dans la MMF des données (OK)--> lecture de la MMF par une appli C# pour traitement (même problème que précédemment)

    Il s'agit donc ici, à partir d'un tableau de byte récupéré, de pouvoir le parser pour remplir des objets.

    Ce que je sais: je connais l'enchainement des types en mémoire (je sais donc ou couper mon tableau de bytes), j'ai a ma disposition des classes représentant chacunes de mes structures C++

    Ce que je n'arrive pas à faire: pondre un algorithme qui irait prendre les n premiers octets en fonction du type du premier champ de ma première classe, puis prendre les m octets suivants en fonction du type du 2 ème champ de ma classe, et ainsi de suite de manière récursive car j'ai des classes(c#)/structures(C++) imbriquées.

    Au final, si j'avais une instance d'une structure C++ de la forme

    struct{
    int toto = 4;
    char tutu = 'c';
    }toto_struct;

    j'aimerais avoir une instance d'un objet de la forme

    public class toto_struct
    {
    int toto = 4;
    char tutu = 'c';
    }

    Voila pourquoi je me suis basé sur de la réflexion, sans succès.

    c.f. les bouts de code si dessus.
    --
    Carpe Diem

  12. #12
    Membre habitué Avatar de jerome.fortias
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 164
    Points : 133
    Points
    133
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si quelqu'un a une idée de génie.. sinon je serais obligé de changer mon code C# en du code C++.
    Bah cela dépend enfait de ta compétence. Le C# étant quand même trés différent du C++ (pas de multihéritage par exemple). Alors cela dépent de ta compétence réelle en C++.

    Cool enfin une discussion stimulante... sauf que là je sèche. Bon j'essaie de regarder cela ce week end (je suis chez un client là)
    Jerome Fortias
    Head of the Business Lab Sopra Steria Brussels

  13. #13
    Membre habitué Avatar de jerome.fortias
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 164
    Points : 133
    Points
    133
    Par défaut
    Euh ton tableau de byte tu le récupères bien ?
    Jerome Fortias
    Head of the Business Lab Sopra Steria Brussels

  14. #14
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Le C# étant quand même trés différent du C++ (pas de multihéritage par exemple)
    Tant mieux parce que le multihéritage est déconseillé et révèle d'un problème de conception.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  15. #15
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Je suis un peu perdu concernant ton problème.
    Le type des champs de ta classe n'est pas prédéfinie si je comprends bien. Ils sont codés en binaires dans ton tableau et tu sais où le code binaire se trouve, non ?
    Mais à la base c'etait koi du texte ? Dans ce cas il suffirait de reconvertir les données binaires en string non ?

    Si je me plante complétement dis le moi et dans ce cas peux tu me réexpliquer le problème plus clairement, stp ?
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  16. #16
    Nouveau membre du Club Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Points : 32
    Points
    32
    Par défaut
    Ouais, mon tableau de byte je le récupère niquel.

    quand je parlais de changer du code C# en code C++, c'est un abus de langage; il me faudrait intégralement tout recoder (différemment bien entendu) uniquement parce que je sais comment lire dans une MMF en C++ et compléter des structures ... ca serait con d'en arriver là, mais s'il le faut ...

    En c++, je peux utiliser la fonction CopyMemory (&ma_struct,&tab_bytes,size_of_ma_struct) qui fonctionne à merveille

    Ca marche car en mémoire, une structure C++ est la suite des types de la structure. il faudrait que je trouve l'équivalent en C# du genre:
    CopyMemory(my_object, my_byte_array, size_of_byte_array);

    Wali Walou !!
    --
    Carpe Diem

  17. #17
    Nouveau membre du Club Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Je suis un peu perdu concernant ton problème.
    Le type des champs de ta classe n'est pas prédéfinie si je comprends bien. Ils sont codés en binaires dans ton tableau et tu sais où le code binaire se trouve, non ?
    Mais à la base c'etait koi du texte ? Dans ce cas il suffirait de reconvertir les données binaires en string non ?

    Si je me plante complétement dis le moi et dans ce cas peux tu me réexpliquer le problème plus clairement, stp ?
    En fait, j'ai des structures C++. je les fous en mémoire partagée et une appli C# vient les lire, et récupère donc du binaire. L'étape d'après consiste, à partir de ce binaire, à le caler dans des objets, donc je connais tout (types, taille, ...).

    En gros je fais un passage:
    c++ --> binaire --> C#, sauf que j'arrive pas à parser mon binaire pour le stucturer dans mes objets.

    Si ca peut t'éclairer...

    Edit: ce sont les données contenues dans la structures que je veux transférer, pas la structure elle meme...
    --
    Carpe Diem

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Points : 780
    Points
    780
    Par défaut
    Citation Envoyé par OtI$ Voir le message
    c++ --> binaire --> C#,
    Pourquoi tu n'utilises pas le C++ managed qui y trouverait tout son rôle?

  19. #19
    Nouveau membre du Club Avatar de OtI$
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Chubyone Voir le message
    Pourquoi tu n'utilises pas le C++ managed qui y trouverait tout son rôle?
    Simplement parceque je ne connais pas cette alternative ... pourrais tu la développer ?
    --
    Carpe Diem

  20. #20
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Mais un Convert.ToInt32() avec comme paramètre ta donnée binaire ne conviendrais pas ? Un exemple pour les entiers.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

Discussions similaires

  1. [Débat] Technologie .NET vs JAVA
    Par neo.51 dans le forum Débats sur le développement - Le Best Of
    Réponses: 1047
    Dernier message: 14/01/2019, 17h15
  2. A ceux qui ont migré de VB6 vers VB.Net
    Par Fox dans le forum VB 6 et antérieur
    Réponses: 81
    Dernier message: 21/05/2008, 15h56
  3. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 14h49
  4. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 16h57
  5. Fichier PDOXUSRS.NET
    Par yannick dans le forum Paradox
    Réponses: 5
    Dernier message: 05/04/2002, 10h45

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