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 :

[DLL_C] DllImport: Importer et exploiter une librairie DLL C


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut [DLL_C] DllImport: Importer et exploiter une librairie DLL C
    Bonjour,

    J'ai une DLL C sans les source, j'aimerais l'utiliser.. j'ai essayé de faire un ajout de reference, mais VS, me dit:
    Une reference à MA_DLL_EN_C.DLL n'a pas pu être ajoutée. Assurez vous que le fichier est accessible, et qu'il s'agit d'un assembly valide, ou d'un composant COM
    merci

  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

    C'est logique puisque ta librairie n'est pas COM...

    Il faut donc passer par une technique appelée : Interop

    Il y a des tutoriels dessus sur le site !

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    Alors tu dois connaitre le prototype des fonctions.

    ensuite tu dois les déclarer les memes fonctions en utilisant l'attribut DLLImport.

    un lien pour t'aider
    http://morpheus.developpez.com/dlldotnet/
    il vaut mieux prendre son pied que de se prendre la tête!!

    http://bossun.noxblog.com

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    En effet apres quelques minute de recherche j'ai trouvé ca...

    je crois que jvais ramer... donc je posterais si besoin


    merci !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    hum alors j'ai un pti souci, je vous donne le message d'erreur et le code, ca vous parlera sans doute mieux:

    Erreur 1 Les pointeurs et les mémoires tampons de taille fixe ne peuvent être utilisés que dans un contexte unsafe \Form1.cs 15 50
    le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("MY.DLL")]
    public static extern int MyFct(long *lSer, long lkey, byte[] tF, long *plNb, DateTime psDate, long tC);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
               long lSer = new long();
                long lkey = 123456;
                byte[] tf = new byte[40];
                long lNb = new long(); ;
                object psDate = new object(); ;
                byte[] tC = new byte[18];
     
     
                fixed (long* plSer = lSer)
                fixed (byte* ptF = tF)
                fixed (long* plNb = lNb)
                {
                    int i = MyFct(&lSer, lKey, &tF, &plNbPoste, 0, tC);
                }

    voici la signature de la fonction C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TOOLSAPIP(int) MyFct(LPLONG lSer,long lKey,TFLAG tFlag,LPLONG plNb,LPSDATE psDate,TCODE tC);

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    hum j'ai progréssé (un peu), ca compile

    mais a l'execution j'ai ce message:
    Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée

    voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            [DllImport("MY.DLL")]
            public static extern int MyFct(IntPtr lSer, int lKey, byte[] tFlag, IntPtr plNb, string psDate, byte[] tC);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            public static void test()
            {
     
                IntPtr longSer = new IntPtr();
                int longKey = 12345;
                byte[] tflag = new byte[10];
                IntPtr lNb = new IntPtr();
                string psDate;
                byte[] tC = new byte[15];
     
    int i = MyFct(lSerie, lKey, tflag, lNb, null, tC);
            }

    Peut etre qu'il faut que j'utilise fixed ? mais je patine... fixed (IntPtr plSer = lSer)
    compile pas...



    Ps: j'ai trouvé un site pas mal qui referenci un tableau avec les type c#/c++/c :
    http://www.codeproject.com/KB/dotnet...stoDotNET.aspx

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    hum en mettant
    int i = MyFct(ref lSerie, lKey, ref tflag, lNb, "", ref tC);


    et modifiant la signature en consequence avec 3 ref ..

    j'obtiens:
    Le runtime a rencontré une erreur irrécupérable. L'adresse de l'erreur était 0x79e74eb5 sur le thread 0xacc. Le code d'erreur est 0xc0000005. Il s'agit peut-être d'un bogue dans le CLR ou dans les portions unsafe ou non vérifiables du code utilisateur. Les causes courantes de ce bogue incluent des erreurs de marshaling utilisateur pour COM-Interop ou PInvoke, erreurs susceptibles d'endommager la pile.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    résolu:
    j'avais envoyé un ref de trop

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

Discussions similaires

  1. [WD15] Imprimer en PDF via une Librairie DLL
    Par cflo56 dans le forum WinDev
    Réponses: 10
    Dernier message: 21/01/2011, 14h33
  2. [Lazarus] Créer et utiliser une librairie .dll ou .so
    Par parhelie dans le forum Lazarus
    Réponses: 2
    Dernier message: 08/08/2010, 15h24
  3. [D5] - Tester si une librairie (dll) est installée sur le PC
    Par davidkungfu dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 14/05/2010, 17h16
  4. Importation externe d'une librairie
    Par lichman dans le forum R
    Réponses: 1
    Dernier message: 12/10/2009, 17h21
  5. Recompiler une librairie dynamique (DLL) en statique
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 07/04/2005, 19h28

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