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 de librairie .lib


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 99
    Par défaut utilisation de librairie .lib
    Bonjour,

    Je pensais que les librairies ".lib" ne pouvait être utilisées en c#.
    Développant un logiciel pour commander une carte ADVANTECH PCM3725 fonctionnant sur le bus ISA je leur ai donc demander qu'il m'envoie la librairie en .dll

    Voici leur réponse:

    When downloading the link I send to you, there is the Adsapi32.libavailable.
    C# is also based on *.dll so I don’t see any problems why C# should not supported.
    Donc je peux utliser Adsapi32.lib pour mon logiciel en C#?
    Comment l'utiliser?

    Merci

  2. #2
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    Je n'ai jamais essayé ni vu d'exemple de p/invoke sur ca, mais...
    Un fichier .lib n'a pas grande différences avec un fichier .dll
    Pour simplifier, il y a deux type de .lib :

    - Le fichier sert uniquement à gérer la liaison. Ca permet dans un code C/C++ de faire appel aux fonctions de la lib sans avoir à se coltiner tout le code de chargement de la DLL et ce genre de petits trucs. Auquel cas, tu as quand même une DLL et donc tu fais ton p/invoke sur la dll en question.

    - Le fichier contient le code des fonctions, la lib est uniquement statique. Donc là, tu n'a pas de DLL. Ne sachant pas si c'est possible de faire un p/invoke dessus, le mieux est de tester, tu regarde leurs doc, tu prend une fonction simple et tu écris sont p/invoke, si ca marche tant mieux sinon il te reste une solution.

    Puisque tu as un .lib tu peux écrire une DLL en C qui ne fait qu'encapsuler les fonctions. Ainsi tu obtiendra une DLL que tu pourra appeler par p/invoke.

  3. #3
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 99
    Par défaut
    J'ai pas trop compris désolé

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    On va prendre un exemple très simple,
    admettons que dans ta lib tu as une fonction "int GetNumberOne()" qui ne fait qu'une chose : retourner 1
    Oui, c'est inutile, mais c'est simple :p

    Tu as donc un fichier Adsapi32.lib qui contient cette fonction, alors dans ton code csharp, tu teste d'abord si tu peux utiliser directement ce .lib :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public static class AdsApi32
    {
        // Ca c'est un p/invoke
        [DllImport("adsapi32.lib")]
        public static extern int GetNumberOne();
    }
     
    public class TonProgramme
    {
        public void UneMethodeAToi()
        {
            int Nombre1 = AdsApi.GetNumberOne();
        }
    }

    Si ca ne fonctionne pas c'est qu'il faut écrire la DLL qui encapsule le fichier lib. Mais là, ca se passe en C, donc il te faut un compilateur pour aller avec.

    Tu écris donc une DLL en C :
    Code c : 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
     
    #include <stdio.h>
    #include <adsapi32.h>
     
    extern "C"
    {
        // On déclare une fonction à exporter en lui donnant le nom de la fonction
        // qu'elle encapsule + un préfixe pour éviter l'ambiguité
        __declspec(dllexport) int ads_GetNumberOne()
        {
            // Une fonction qui encapsule une autre c'est une fonction qui se
            // contente d'appeller une autre. En l'occurrence ta fonction
            // appelle simplement celle présente dans le fichier .lib
            // Ainsi cette fonction devient totalement identique à celle présente
            // dans la lib à ceci près qu'elle est présente et exporté dans une dll.
            return GetNumberOne();
        }
    }

    Maintenant tu retouche le code cité plus haut pour l'adapter :
    Code csharp : 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
     
    public static class AdsApi32
    {
        // On appelle maintenant la dll avec le nom de fonction préfixé puisqu'on
        // appelle la fonction présente dans la dll et non dans la lib
        [DllImport("adsapi32.dll")]
        public static extern int ads_GetNumberOne();
    }
     
    public class TonProgramme
    {
        public void UneMethodeAToi()
        {
            int Nombre1 = AdsApi.ads_GetNumberOne();
        }
    }

  5. #5
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 99
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("Adsapi32.lib")]
            public static extern int DRV_DeviceOpen(Int32 DeviceNum, Int32 DriverHandle);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     private void button19_Click(object sender, EventArgs e)
            {
                ErrCde = DRV_DeviceOpen(0, DriverHandle);
            }
    Voici l'erreur générée:

    Impossible de charger la DLL 'Adsapi32.lib': Le module spécifié est introuvable. (Exception de HRESULT : 0x8007007E)
    Comment faire?

  6. #6
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Déjà avant d'aller plus loins, faut que le fichier lib/dll soit dans le même répertoire que ton programme sans quoi il ne le trouvera pas (enfin, pas tout à fait vrai, mais bon, copie-le quand meme histoire d'etre sur que c'est pas juste parce qu'il ne trouve pas le fichier).

    Ensuite, si ca marche toujours pas, faut faire ce que j'ai éxpliqué plus haut : écrire une dll en C.

  7. #7
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 99
    Par défaut
    J'ai ajouter dans la propriété de Adsapi.lib toujours copier dans le répertoire de sortie.

    Nouvel erreur:
    Tentative de chargement d’un programme de format incorrect. (Exception de HRESULT : 0x8007000B)

Discussions similaires

  1. Problème avec l'utilisation de librairies
    Par Aradesh dans le forum MFC
    Réponses: 3
    Dernier message: 01/08/2005, 15h00
  2. portage d'une appli utilisant la librairie word
    Par neonico dans le forum MFC
    Réponses: 4
    Dernier message: 23/02/2005, 23h48
  3. Creer et utiliser une librairie externe à l'exécutable
    Par multani dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 06/11/2003, 10h11
  4. Utiliser une librairie graphique
    Par Troopers dans le forum Linux
    Réponses: 6
    Dernier message: 22/08/2003, 11h22
  5. inclure une librairie *.lib
    Par darkbm dans le forum C
    Réponses: 2
    Dernier message: 16/12/2002, 22h48

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