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 :

utilisation d'un dll native en C#


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut utilisation d'un dll native en C#
    Bonjour
    je suis entrain de développer une application (avec C# et le framework.Net) qui consomme des données stockées dans une carte RFID. le prob c'est que j'arrive pas à intégrer dans cette application une dll (codé en langage C) qui contient toutes les fonctions qui exploitent la carte à puce.
    merci pour votre soutien

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Montre ton code sur la partie intégration des fonctions C !

  3. #3
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    d'abord merci bcp
    j'ai seulement la dll et je sais qu'elle est codé en C

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 251
    Par défaut
    As-tu des exemples de codes avec ta dll pour l'utiliser dans différents langages comme VB peut-être ?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    Je repose ma question :

    Montre nous ton C# où tu fais tes déclarations de méthode C via DllImport, ainsi que le fichier .h de la dll écrite en C si tu l'as

  6. #6
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    j'ai utilisé P/invoque pour interroger la DLL mais tjr j'ai l'exception suivante :
    AccessViolationException
    Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.

  7. #7
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    - La signature de la méthode C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern __declspec( dllexport )
        int ReadCardId(
            IN OUT unsigned char* CardId,
            IN OUT unsigned int* CardIdSize );

    - La signature de la méthode C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("CardLib.dll", CharSet = CharSet.Auto)]
            public static extern int ReadCardId(String CardId, int CardIdSize);

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par sysalpha Voir le message
    S.O.S
    C'est pas IntPtr pour CardIdSize ? D'un côté t'as un pointeur et pas dans ton C#

  9. #9
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    comment résoudre cela stp ?
    merci

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 10
    Par défaut
    Je pense que tu n'a pas 36 façon de faire.

    tu dois créer un Wrapper dans une dll C++/CLI.
    dedans utiliser la fonction LoadLibrary

    il faut allouer ton CardId et CardIdSize dans ton c++/CLI et créé ensuite une chaine String^ avec ton resultat.

    et ne pas oublier de supprimer les allocations memoires

  11. #11
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    Citation Envoyé par Aktaour Voir le message
    Je pense que tu n'a pas 36 façon de faire.

    tu dois créer un Wrapper dans une dll C++/CLI.
    dedans utiliser la fonction LoadLibrary

    il faut allouer ton CardId et CardIdSize dans ton c++/CLI et créé ensuite une chaine String^ avec ton resultat.

    et ne pas oublier de supprimer les allocations memoires
    j'ai pas les fichiers sources de la dll.
    est ce que possible de trouver une solution avec p/invoke?

  12. #12
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    En suivant la remarque de PitMaverick78

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [DllImport("CardLib.dll", CharSet = CharSet.Auto)]
            public static extern int ReadCardId(String CardId, out IntPtr CardIdSize);
     
    void test()
    {
       IntPtr ptr = new IntPtr(0);
     
       ReadCardId("maChaine", out ptr);
    }

  13. #13
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Par défaut
    Citation Envoyé par Arnard Voir le message
    En suivant la remarque de PitMaverick78

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [DllImport("CardLib.dll", CharSet = CharSet.Auto)]
            public static extern int ReadCardId(String CardId, out IntPtr CardIdSize);
     
    void test()
    {
       IntPtr ptr = new IntPtr(0);
     
       ReadCardId("maChaine", out ptr);
    }
    le problème persiste toujours

  14. #14
    Membre éprouvé Avatar de bibbi
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 113
    Par défaut
    Je pense que cela vient du fait que tu n'aies pas alloué ta mémoire sur ton IntPtr.

    Il faut l'allouer avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IntPtr ptr = Marshal.AllocHGlobal(taille);
    Je pense aussi qu'il ne faut pas de "out" dans la déclaration de la fonction ni un IntPtr mais un ref uint et un StringBuilder sur le CardId.

    Si je comprends bien, ton CardId et une chaîne que tu reçois en sortie, donc un pointeur sur une string.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("CardLib.dll", CharSet = CharSet.Auto)]
            public static extern int ReadCardId(StringBuilder CardId, ref uint CardIdSize);
    Si tu veux des exemples, va sur PInvoke

Discussions similaires

  1. Utilisation d'une DLL native en java
    Par sysalpha dans le forum Général Java
    Réponses: 3
    Dernier message: 26/01/2011, 17h43
  2. [VB2005] Utilisation de DLL native cryptée
    Par nikoko34 dans le forum VB.NET
    Réponses: 12
    Dernier message: 01/08/2007, 15h42
  3. Utilisation d'une dll native par une toolbar managée
    Par didierll dans le forum C++/CLI
    Réponses: 1
    Dernier message: 10/07/2007, 07h56
  4. [C# 2.0] Utilisation d'un IntPtr par une dll native
    Par SesechXP dans le forum C++/CLI
    Réponses: 5
    Dernier message: 05/07/2007, 15h00
  5. Réponses: 2
    Dernier message: 28/05/2006, 11h34

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