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 :

visual studio, (dé)sérialisation et assembly


Sujet :

C#

  1. #1
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut visual studio, (dé)sérialisation et assembly
    Bonjour

    Sous Visual Studio 2013, dans une solution S1, j'ai un projet P1 contenant une classe CL1, dans laquelle est écrit des fonctions pour sérialiser et dé-sérialiser des données binaires, en utilisant comme modèle (template) d'autres classes.

    Ayant besoin de ces fonctions ailleurs, j'ai fait un copier + coller du code de la classe CL1 dans une classe CL2. La classe CL2 se situe dans un autre projet P2, qui est lui-même au sein de la solution S2.

    Tous les noms des solutions, projets, classes, namespace et autres sont différents, seul le code copié, à l'intérieur des classes, est identique d'une classe à l'autre.

    Quand je tente d’exécuter une fonction de (dé)sérialisation de la classe 2, j'obtiens, dans un try catch, la levée de l'exception suivante :

    "Impossible de trouver l'assembly NomProjet_P1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'."

    NB 1 : Les deux projets / solutions sont des applications consoles.

    NB 2 : aucune erreur ni warning à la compilation / génération

    Quelqu'un aurait-il assez de connaissances pour me guider dans la résolution de ce problème ?
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    à priori, pour le compilateur, il considère que les classes sont différentes.

    Le plus simple pour partager des classes entre projets et sérialiser / désérialiser facilement sans avoir de blague est de faire une assembly commune qui sera
    référencée par chacun des projets... comme ça, tes objets à utiliser seront "uniques"...
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    à priori, pour le compilateur, il considère que les classes sont différentes.
    Oui, c'est normal, puisque que c'est le cas : les deux classes sont dans 2 projets différents, qui sont eux-mêmes dans deux solutions différentes.

    Comme d'ailleurs tous les autres objets des 2 projets.

    Citation Envoyé par theMonz31 Voir le message

    Le plus simple pour partager des classes entre projets et sérialiser / désérialiser facilement sans avoir de blague est de faire une assembly commune qui sera
    référencée par chacun des projets... comme ça, tes objets à utiliser seront "uniques"...
    Je ne veut pas pas faire de partage de classes entre les deux projets.

    En lisant cette réponse, je pense que mes explications ont été mal comprises, donc je reformule.

    Pour mon programme actuel, j'ai créé une nouvelle solution de type application console, avec un nouveau projet dedans.

    Puis, j'ai créé les classes dont j'ai l'utilité.

    Ensuite, j'ai eu besoin de faire de la sérialisation / dé-sérialisation. Je me suis souvenu l'avoir déjà fait dans un autre projet.

    J'ai donc copier et coller le code des fonctions d'un projet à l'autre, d'une classe à une autre classe complètement différente.
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    serialisation binaire ou xml ?
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    serialisation binaire ou xml ?
    Les données sont stockées dans des fichiers binaires.

    [edit]

    Je viens de tester un truc.

    Dans mon nouveau projet, J'ai supprimé la classe avec les fonctions pour sérialiser / dé-sérialiser.

    J'ai copier coller le code qui m’intéressait depuis la classe de mon ancien projet vers le "bloc-notes"

    J'ai créé une classe vide dans mon nouveau projet.

    Et enfin j'ai copier coller le code depuis le "bloc-notes" vers ma nouvelle classe.

    Mais toujours la même exception
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    je reste persuadé qu'il te faut 3 projets

    2 projets qui correspondent à tes exécutables et un projet qui sera un projet de type librairie qui comprendra les classes pour (de)sérialiser les objets.

    Je ne vois pas d'autres solutions.
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  7. #7
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    je reste persuadé qu'il te faut 3 projets.
    Je ne comprends pas comment le fait d'avoir un 3ème projet dans une 3ème solution visual studio va régler le problème.

    Je n'arrive pas à cerner l'origine et la raison du souci.
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  8. #8
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    il ne s'agit pas d'avoir une 3ième version dans un 3ième visual studio...


    D'ailleurs, tu pourrais très bien mettre tous tes projets dans une seule solution, ça serait surement plus simple (le debuggueur permet de lancer plusieurs applications
    en meme temps).

    tu as juste une assemble à faire... contenant tes classes et tes projets consoles font référencer cette assembly...

    Tu vas supprimer les classes de tes projets consoles pour avoir qu'une seule classe dans l'assembly partagé...

    Je ne peux pas être plus clair... désolé si tu ne comprends pas, moi j'abandonne après ça !!!
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  9. #9
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    D'ailleurs, tu pourrais très bien mettre tous tes projets dans une seule solution, ça serait surement plus simple (le debuggueur permet de lancer plusieurs applications
    en meme temps).

    tu as juste une assemble à faire... contenant tes classes et tes projets consoles font référencer cette assembly...
    Oui je sais, j'ai déjà fait ce genre de chose pour des projets personnels

    Mais, dans notre cas, je suis contraint par mon cadre professionnel, je ne peux pas tout regrouper dans une seule solution visual studio.

    Je suis dans l'obligation de faire un nouveau projet dans une nouvelle solution.

    Et vu que le projet plus ancien est déployé sur les postes clients (environ 50 000), interdiction de le modifier, sans passer par tout un processus administratif très long et plutôt coûteux. (Vive les normes iso "à la noix" )

    Hier soir j'ai appris des ces données était aussi stockées dans des fichiers excel, je vais donc utiliser ces derniers, a mon avis ça sera plus simple à implémenter : pas de sérialisation / dé-sérialisation, juste de la lecture / écriture en direct.
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  10. #10
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'ai déjà eu ce problème lors de sérialisation d'objets transmis par réseau avec un client et un serveur.

    Si on ouvre le binaire sérialisé on voit qu'il stock l'assembly et la version.

    Je suis d'accord avec 'theMonz31' lors de mes tests j’avais réussi à résoudre ce problème via une dll externe que j'avais créer, donc un troisième projet.
    Mais ce n'est pas la solution que j'ai garder.

    Dans les 2 projets les classes a sérialiser doivent avoir le même namespace et le même nom.
    Dans le project qui doit désérialiser ajouter ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        class BindChanger : System.Runtime.Serialization.SerializationBinder
        {
            public override Type BindToType(string assemblyName, string typeName)
            {
                // Define the new type to bind to
                Type typeToDeserialize = null;
                // Get the current assembly
                string currentAssembly = Assembly.GetExecutingAssembly().FullName;
                // Create the new type and return it
                typeToDeserialize = Type.GetType(string.Format("{0}, {1}", typeName, currentAssembly));
                return typeToDeserialize;
            }
        }
    Et avant de désérialiser modifier le Binder du BinaryFormatter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Binder = new BindChanger();

Discussions similaires

  1. News Visual Studio
    Par farscape dans le forum Visual C++
    Réponses: 34
    Dernier message: 27/04/2010, 10h21
  2. [Visual studio 2005] - Assembly introuvable
    Par Anto03 dans le forum Visual Studio
    Réponses: 0
    Dernier message: 02/09/2007, 18h24
  3. [C#][Visual studio]Assemblies?????
    Par Sodangbe dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/04/2006, 20h02
  4. Probleme d'utilisation de directX 9 avec visual studio.net
    Par cranedoeuf dans le forum DirectX
    Réponses: 1
    Dernier message: 24/05/2004, 04h33
  5. Version de Windows dans Visual Studio !!!
    Par Jasmine dans le forum MFC
    Réponses: 3
    Dernier message: 18/03/2004, 17h40

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