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 :

Chargement fichier DLL défectueux.Traitement fichier Json


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Chargement fichier DLL défectueux.Traitement fichier Json
    Bonjour.
    Je maîtrise sans doute mal mon sujet mais après de longue recherches, je m'en remet à vous...
    J'essaye de charger une DLL me permettant de "traduire" un document JSON.
    Voici la méthode en question :

    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
    public static dynamic Parse(dynamic informations, Message encodedMessage)
            {
                //Console.WriteLine("Parse(string encodedPayload) :");
                //Console.WriteLine("   encodedPayload : " + encodedMessage);
     
     
                Message decodedMessage = encodedMessage;
     
     
     
                var myAssembly = Assembly.LoadFile("C:\L.dll");
                //var myType = myAssembly.GetType("DLL.MyType");
                var myType = myAssembly.GetType("DLL.MCS1608");
                //ISensor myInstance = (ISensor)Activator.CreateInstance(myType, informations.SoftwareVersion, encodedMessage.Payload);
                ISensor myInstance = (ISensor)System.Activator.CreateInstance(myType, encodedMessage.Payload);
                var payload = myInstance.decodedPayload();
                var isConfig = myInstance.isConfiguration();
                var isNewConfig = myInstance.isNewConfiguration();
     
                dynamic msg = new JObject();
                msg.DeviceId = decodedMessage.DeviceId;
                msg.Payload = payload;
                msg.Rssi = decodedMessage.Rssi;
                msg.Snr = decodedMessage.Snr;
                msg.Timestamp = decodedMessage.Timestamp;
                msg.IsConfiguration = isConfig;
                msg.IsNewConfiguration = isNewConfig;
     
                Console.WriteLine("   decodedMessage : " + msg.ToString());
                return msg;
            }
    En fait, d'après l'exception qui en résulte, tout se passe bien jusqu'à la création de l'instance.
    Voici le message d'erreur :
    System.ArgumentNullException: Value cannot be null.
    Parameter name: type
    at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
    at System.Activator.CreateInstance(Type type, Object[] args)
    Et je ne le comprend pas trop, en principe mon instance n'est pas nul.

    Auriez vous une idée plus efficace pour charger un fichier DLL dans un dossier, et utiliser les fonction de celui-ci pour traiter mon document Json ?

  2. #2
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 899
    Points : 1 916
    Points
    1 916
    Par défaut
    C'est tout simplement que myAssembly.GetType("DLL.MCS1608"); te renvoie null parce-qu'il ne trouve pas de classe "DLL.MCS1608" dans l'assembly "C:\L.dll". Tu as peut-être mal orthographié le nom de la classe, ou son namespace. Il serait intéressant de savoir d'où vient cette dll et pourquoi tu ne peux pas l'intégrer dans ton projet, via un package NuGet par exemple. Sinon tu peux aussi intégrer une library disponible sur nuget.org comme newtonsoft.json.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    En fait c'est un projet que je réalise en collaboration avec quelques collègues.
    Je me demande si je n'ai pas des gros problèmes de version de framework à résoudre avant toutes choses.. Toutefois ta réponse m'aide beaucoup !
    La librairie est en faite créée par un collègue et placée dans un dossier partagé.

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 899
    Points : 1 916
    Points
    1 916
    Par défaut
    D'accord, je comprends un peu mieux, j'imagine qu'il s'agit d'un projet de groupe en formation. Néanmoins tu aurais probablement intérêt à ajouter une référence à cette dll dans ton projet, ça te permettra de voir tous les types disponibles et de les instancier directement dans ton propre code au lieu de passer par de la réflexion. Si vous en avez le temps je vous conseille de jeter un œil à NuGet, c'est une outil qui permet de gérer les dépendances d'un projet.

    Bon courage pour votre projet.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    J'ai déjà beaucoup téléchargé des package via Nuget mais je ne savais pas que ça permettait de gérer ses propres dépendances je vais y jeter un oeil.
    Je vais probablement revenir avec des question, j'ai changé d'angle d'attaque: J'essayais de créer un service windows mais le déboguage de celui ci est difficile. je vais tout faire dans une application console .net Framework dans un premier temps afin de pouvoir analyser le tout en déboguage pas à pas ...

  6. #6
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 899
    Points : 1 916
    Points
    1 916
    Par défaut
    Tu peux faire un projet console et un projet de service Windows, qui ne contiendront chacun que le code d'infrastructure qui leur est spécifique, et créer à côté un projet de bibliothèque de classes qui contiendra le cœur de tes traitements et sera référencé par les deux autres projets (le tout dans la même solution).

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Vous voulez dire écrire l'intelligence du programme, les méthode, etc dans l'application console et appeler celles ci dans le service ?

  8. #8
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 899
    Points : 1 916
    Points
    1 916
    Par défaut
    Non. Écrire "l'intelligence du programme" dans la dll et l'appeler dans l'application console pour tester/debugger et dans le service pour déployer (si le but est d'avoir une application qui tourne en arrière plan).

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    En fait, pour être plus précis dans mon problème, j'ai déjà une version qui fonctionne, mais en .NET Core.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var myAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(@"Path" + informations.DeviceType + " v" + informations.SoftwareVersion + ".dll");
     
                var myType = myAssembly.GetType("DLL."+informations.DeviceType);
     
                ISensor myInstance = (ISensor)Activator.CreateInstance(myType, encodedMessage.Payload);
                var payload = myInstance.decodedPayload();
                var isConfig = myInstance.isConfiguration();
                var isNewConfig = myInstance.isNewConfiguration();
    Ce code utilise "System.Runtime.Loader" Que je ne peux pas utiliser dans une application .NetFramework. (Exclusivement .NEt Core bizarrement)

    Du coup, j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    System.Reflection.Assembly myAssembly = Assembly.LoadFile(@"C:\IoT4Factory\DLLs\" + informations.DeviceType + " v" + informations.SoftwareVersion + ".dll");
     
                Type myType = myAssembly.GetType("DLL." + informations.DeviceType);
     
                ISensor myInstance = (ISensor)Activator.CreateInstance(myType, encodedMessage.Payload);
                var payload = myInstance.decodedPayload();
                var isConfig = myInstance.isConfiguration();
                var isNewConfig = myInstance.isNewConfiguration();
    qui est disponible dans System.Reflection

    Mais impossible d'obtenir le même résultat ... :/ Du moins, pas de cette manière...


    Or j'ai absolument besoin de passer dans le .Net FrameworK pour en faire un service ...

    Merci de votre aide en tout cas

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    J'ai résolu une partie du problème, je n'arrivais pas à charger la DLL à cause d'un conflit de version de framework ... -_-

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Message decodedMessage = encodedMessage;
     
     
                var myAssembly = System.Reflection.Assembly.LoadFile(@"Path" + informations.DeviceType + " v" + informations.SoftwareVersion + ".dll");
     
                var myType = myAssembly.GetType("DLL." + informations.DeviceType,true);
     
                ISensor myInstance = (ISensor)System.Activator.CreateInstance(myType, encodedMessage.Payload);
    ISensor est une interface.
    Je bloque maintenant à la création de l'instance... J'obtient cette exception :
    System.InvalidCastException: 'Unable to cast object of type 'DLL.MCS1608' to type 'GlobalSensorF.ISensor'.'

  11. #11
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 899
    Points : 1 916
    Points
    1 916
    Par défaut
    Est-ce-que la classe DLL.MCS1608 développée par votre collègue implémente l'interface GlobalSensorF.ISensor ? Si ce n'est pas le cas vous ne pouvez pas récupérer l'objet en tant que DLL.MCS1608 puisque en effet ce n'en est pas un.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2018
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Bon sang, ce que je me sens bête !
    Bloqué deux jours à cause de problèmes aussi simples...
    Merci beaucoup pour votre aide Noxen, j'aurais probablement pas trouvé la solution avant encore quelques jours sans vous !

  13. #13
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 899
    Points : 1 916
    Points
    1 916
    Par défaut
    C'est pour ça que je recommandais de référencer la dll dans le projet, ça permet de bénéficier de toute la puissance de l'intellisense sur les objets manipulés. Bon courage pour la suite ;-)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/04/2015, 20h50
  2. Réponses: 5
    Dernier message: 10/09/2013, 14h04
  3. [C#] Chargement de DLLs depuis un fichier
    Par BillyKane59 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/03/2011, 17h03
  4. [DLL] Utiliser un fichier dll en java
    Par Bourak dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 24/01/2009, 09h22
  5. Processus, DLL, Enlever un fichier DLL
    Par pier* dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 02/05/2006, 10h58

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